定义 users 和 articles 的 Relationship ,返回数据为空,请各位帮我看下,非常感谢

刚刚学习laravel,跟着教程一路做,遇到了一个Relationship 莫名的问题,问题如下:

1,这是生成Articles表格的migration:


class CreateArticleTable extends Migration
{
   
    public function up()
    {
        Schema::create('articles', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title');
            $table->text('body');
            $table->timestamp('publishat');
            $table->timestamps();
            $table->integer('user_id')->unsigned()->default(1);
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('articles');
    }

  

2、对应的Article表的model

<?php

namespace App;

use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;

class Article extends Model

{
    protected $table='articles';
    protected $fillable=['title','body','publishat','user_id'];
    protected $dates=['publishat'];

    public function setPublishatAttribute($date)
    {
       $this->attributes['publishat']=Carbon::createFromFormat('Y-m-d',$date);
    }

    public function scopePublishat($query)
    {
       $query->where('publishat','<=',Carbon::now()) ;
    }

    public function user()
    {
        return $this->belongsTo('App\User');
    }

}

3、对应的Users表格的model文件:

<?php

namespace App;
use App\Article

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;


class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    public function articles()
    {
        return $this->hasMany('App\Article');
    }
}

问题:

在tinker界面下执行:

$article = new App\Article::first();

报错:PHP Parse error: Syntax error, unexpected T_STRING, expecting T_VARIABLE or '$' on line 1

但执行 $article = new App\Article; //没问题
然后执行:$article->first(); //正常返回数据
执行:$article->user //返回null

同样,执行对应的 $user->articles //也返回null,
请各位帮我看看到底是哪儿出了问题,数据库都来回 migrate:refresh 好多次了,但就是解决不了问题,谢谢大家

你的上面这个应该是这样,你试试:

$article = new App\Article;
$article = $article->find(1);
$article->user;

你看看,这个结果有什么不一样?能看出其中的区别?

JellyBool
$article = new App\Article::first();

这很明显有错。。你试试这样:

$article = App\Article::first();

看看你的 PHP 版本?

bluesnow 回复 JellyBool

多谢回复 ,php 版本为7.0,

执行:>>> $article = App\Article::first();

=> App\Article {#715
     id: 1,
     title: "CPU宸环",
     body: "php artisan migrate:refresh",
     publishat: "2016-11-24 18:33:53",
     created_at: "2016-11-24 18:33:53",
     updated_at: "2016-11-24 18:33:53",
     user_id: 1,
   }

在教主回答了这个问题后,居然这个问题就直接自动解决了,除了多那个NEW之外,会是laravel的缓存在作怪吗??再次感谢博主!

JellyBool 回复 bluesnow

恩,有可能是缓存的

bluesnow 回复 JellyBool
>>> $article=new App\Article;
=> App\Article {#702}
>>> $article->find(1);
=> App\Article {#701
     id: 1,
     title: "CPU宸环",
     body: "php artisan migrate:refresh",
     publishat: "2016-11-24 18:33:53",
     created_at: "2016-11-24 18:33:53",
     updated_at: "2016-11-24 18:33:53",
     user_id: 1,
   }
>>> $article->user;
=> null

请问教主,为何这样执行命令,就只会返回空呢?谢谢

JellyBool 回复 bluesnow
$article->user()

这样有结果么

bluesnow 回复 JellyBool

谢谢您的回复,刚刚执行了一下,这是结果:

    >>> $article = new App\Article;
=> App\Article {#698}
>>> $article->find(1);
=> App\Article {#718
     id: 1,
     title: "CPU宸环",
     body: "php artisan migrate:refresh",
     publishat: "2016-11-24 18:33:53",
     created_at: "2016-11-24 18:33:53",
     updated_at: "2016-11-24 18:33:53",
     user_id: 1,
   }
>>> $article->user();
=> Illuminate\Database\Eloquent\Relations\BelongsTo {#703}
>>>

这样也没有预想要的结果,奇怪的是它并没有返回null

JellyBool 回复 bluesnow

这样试试,我看看代码貌似没有什么问题

$article = App\Article::find(1);
$article->user;
bluesnow 回复 JellyBool

用您这两行代码没有问题,会返回正确的结果,但分开就不行,很奇怪,

JellyBool 回复 bluesnow

你的上面这个应该是这样,你试试:

$article = new App\Article;
$article = $article->find(1);
$article->user;

你看看,这个结果有什么不一样?能看出其中的区别?

bluesnow 回复 JellyBool

$article = new App\Article;
$article = $article->find(1);
$article->user;

教主就是教主,这样就对了,再次感谢

bluesnow 回复 JellyBool

感觉是只要用了 new 这个关键字,生成相应的新的model的实例,就不会有正确的结果了,再次感谢您百忙中的回复

bluesnow 回复 JellyBool

下面是 user 这个model的执行结果:

    >>> $user = new App\User;
=> App\User {#704}
>>> $user->find(1);
=> App\User {#716
     id: 1,
     name: "icanfly",
     email: "yuxi767@gmail.com",
     created_at: "2016-11-24 18:33:40",
     updated_at: "2016-11-24 18:33:40",
   }
>>> $user->articles;
=> Illuminate\Database\Eloquent\Collection {#705
     all: [],
   }
>>> $user->articles();
=> Illuminate\Database\Eloquent\Relations\HasMany {#702}
>>> $user->articles->toArray();
=> []
>>>

JellyBool 回复 bluesnow

再不行,就把数据库表的数据给我看一下

bluesnow 回复 JellyBool

结题,感谢博主

JellyBool 回复 bluesnow

没事,像这种认真问问题的,我会的都会认真回复的咯

phperllh

我觉得是个有一个返回的数据才能用关联模型的.

phperllh

要取得的话 $user->find()->articles;

cigear

dsdfsd