Laravel 5 - 使用关系时的未定义属性

时间:2015-11-18 13:26:44

标签: php laravel laravel-5 eloquent relationship

我从一个从表中返回项目数据的基本查询开始:

$project = Project::find($id);
return view('project.show')->with('project', $project);

然后在我的页面上dd()' $project->id并且它有效。

我现在还有一个名为user的表。

项目属于用户,因此我在模型中设置了关系:

public function user()
{
    return $this->belongsTo('App\User');
}
然后我做了:

$project = Project::with('user')->where('id', $id)->get();

但我收到错误:

  

未定义属性:Illuminate \ Database \ Eloquent \ Collection :: $ id

如果我只是dd() $project

Collection {#200 ▼
    #items: array:1 [▼
    0 => Project {#196 ▼
      #fillable: array:1 [▶]
      #dates: array:2 [▶]
      #connection: null
      #table: null
      #primaryKey: "id"
      #perPage: 15
      +incrementing: true
      +timestamps: true
      #attributes: array:5 [▶]
      #original: array:5 [▶]
      #relations: array:1 [▶]
      #hidden: []
      #visible: []
      #appends: []
      #guarded: array:1 [▶]
      #dateFormat: null
      #casts: []
      #touches: []
      #observables: []
      #with: []
      #morphClass: null
      +exists: true
      +wasRecentlyCreated: false
    }
    ]
}

我做错了什么?

为了澄清,我希望能够做到:

$project->id
$project->user->name

3 个答案:

答案 0 :(得分:1)

get()方法将始终返回Illuminate\Database\Eloquent\Collection个对象。这意味着您的$project变量为Collection,因此当您尝试$project->id时,您尝试访问id上的Collection属性,它不存在。这就是你得到错误的原因。

有几种不同的方法可以达到你想要做的事情。它们显示在下面的代码中。它们几乎都是等价的。

// This is your code, just added the call to first() on the Collection
// to get the first item in the Collection
$project = Project::with('user')->where('id', $id)->get()->first();

// This is a little more efficient. It is calling first() on the QueryBuilder.
// This will directly return the desired object, without having to create
// an intermediate Collection.
$project = Project::with('user')->where('id', $id)->first();

// This is equivalent to the previous statement, just a little cleaner.
// find() is just a shortcut for where('id', $id)->first().
$project = Project::with('user')->find($id);

以上所有三个陈述都会为您提供Project对象,然后您可以根据自己的喜好使用该对象:

$project = Project::with('user')->find($id);

// print the id
echo $project->id.PHP_EOL;

// if the user exists, print the name
if ($project->user) {
    echo $project->user->name.PHP_EOL;
}

答案 1 :(得分:0)

尝试类似

的内容
$project = Project::with('user')->find($id);

答案 2 :(得分:0)

我会这样做:

控制器:

Project::where('id', $id)->get();

模型

public function user(){
return $this->belongsTo(User::class);
}

查看

@foreach($project as $i)
 {{ $i->user->user_id }}