情境:
在hasMany
关系上,使用with
函数(用于预先加载),我想限制每行内的结果(而不是总数)。
我正在学习本教程(因为我认为这是从我所阅读的内容中获得所需要的唯一方法) - https://softonsofa.com/tweaking-eloquent-relations-how-to-get-n-related-models-per-parent/
我有一个Model
- hasMany
评论的房间。
会议室型号:
class Room extends Scopes\BaseModel
public function reviews()
{
return $this->hasMany('App\Review');
}
public function latestReviews()
{
return $this->reviews()->latest()->nPerGroup('room_id', 1);
}
作用域/ BaseModel.php:
从网站的教程直接复制,但名称空间为namespace App\Scopes;
使用with功能的控制器:
class Room extends Scopes\BaseModel
$rooms = Room::where('room_types_id', $specialism_id)
->with('latestReviews')
->get();
错误:
RelationNotFoundException.php第20行中的RelationNotFoundException: 在模型[App \ Room]上调用未定义的关系[latestReviews]。
答案 0 :(得分:0)
有两种方法可以做到这一点。第一个更像是:
Room::with(['reviews' => function ($q) {
$q->where('*CONDITION IF NEEDED*')->orderBy('created_at', 'desc')->take(1);
}])->where('room_types_id', $specialism_id)->get();
第二种方法是使用访问者。
public function getLatestReviewAttribute(){
return Review::where('room_id', $this->attributes['id'])->orderBy('created_at','desc')->take(1)->get();
}
您可以使用$room->latest_review->review_column_name;
在视图中访问它
在您的控制器上,您可以Room::all();
;