在model with query中使用Laravel 5自定义方法


laravel 5 custom method in model with query

在我的Room对象中,我想获得具有最低优先级的图片。所以我的房间模型,我添加了:

public function picture(){
    Return Picture::where('room_id', $this->id)->orderBy('priority', 'asc')->first();
}

在我的控制器中,我像这样调用这个方法

public function($id){
  $room = Room::findOrFail($id); 
  $room->picture();
}

但是当我想把它放到我的视图中时,比如:

 {{$room->picture}}

我得到以下错误:

Relationship方法必须返回一个类型为Illuminate'Database'Eloquent'Relations'Relation

当使用{{$room}}时,我没有看到房间对象中的任何图片对象,但应用程序没有崩溃。

如果您希望能够像这样获取最新的图片,您需要将关系定义放在pictures()方法中,而不是获取对象。这样你就可以利用Eloquent的eager loading;获取优先级最低(按值计算)的图片也将非常容易。

将以下内容添加到Room类中:

//relation definition - one to many
public function pictures() {
  return $this->hasMany(Picture::class);
}
//Eloquent getter
public function getPictureAttribute() {
  return $this->pictures()->orderBy('priority', 'asc')->first();
}
现在,您可以通过执行以下命令轻松访问$room对象上最重要的图片:
$picture = $room->picture;

您可以在这里阅读更多关于如何在模型中设置不同类型的关系的信息:http://laravel.com/docs/5.1/eloquent-relationships