Laravel有很多关系,限制查询

时间:2017-02-20 16:35:25

标签: php laravel laravel-5 eloquent

情境: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]。

1 个答案:

答案 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();;