Laravel雄辩获得最新一排相关表格

tri*_*nvh 4 join relationship laravel eloquent

我有两张桌子,章节.一本书有很多章节.

书籍型号:

public function chapters() {
   return $this->hasMany(Chapter::class);
}
Run Code Online (Sandbox Code Playgroud)

章模型:

public function book() {
   return $this->belongsTo(Book::class);
}
Run Code Online (Sandbox Code Playgroud)

我希望使用单个查询获得带有自己最新章节的图书清单,如下所示:

$books = Book::with(['authors', 'categories', 'chapters' => function($q) {
   $q->orderBy('updated_at', 'desc')->first();
}]->get();
Run Code Online (Sandbox Code Playgroud)

但它不起作用.章节返回一个空数组.如果我删除子查询中的first(),它可以正常工作.

有没有办法只用一个查询来做到这一点.我不希望得到所有相关的章节然后保留一个,或使用多个查询.我感觉更好的唯一方法是使用join,是不是?

任何帮助将不胜感激.谢谢!

小智 11

我知道这是一篇旧文章,但有一些新的解决方案,我想与您分享。在 laravel 8 中,有新的辅助函数:latestOfMany、oldestOfMany 和 ofMany。对于您的示例,您可以使用:

public function latestChapter() {
    return $this->hasOne(Chapter::class)->latestOfMany();
}
Run Code Online (Sandbox Code Playgroud)


pat*_*cus 8

由于关系是单独的查询,因此无法为急切加载的关系添加限制.如果这样做,则会限制整个关系查询,它不会作为每个相关对象的限制.

幸运的是,您的需求可以通过额外的关系实现:

public function latestChapter() {
    return $this->hasOne(Chapter::class)->latest();
}
Run Code Online (Sandbox Code Playgroud)

现在,chapters您可以急切地加载新latestChapter关系,而不是急切地加载整个关系.

$books = Book::with(['authors', 'categories', 'latestChapter'])->get();
Run Code Online (Sandbox Code Playgroud)

  • 这不是正确的答案,因为它无法正常工作。生成错误的SQL查询,该查询获取所有章节而不是每本书一个章节 (2认同)