Laravel 5.3 withCount() 嵌套关系
Laravel 5.3 withCount() nested relation
模型结构如下
教程 -> (hasMany) 章节 -> (hasMany) 视频
我们如何使用 laravel 5.3 的 withCount() 方法从教程模型中加载视频数 (video_count)
我试过:
Tutorial::withCount('chapters')
->withCount('chapters.videos') // this gives error: Call to undefined method Illuminate\Database\Query\Builder::chapters.videos()
->all();
编辑
这行得通,还有更好的解决方案吗?
Tutorial::withCount('chapters')
->with(['chapters' => function($query){
$query->withCount('videos');
}])
->all();
您只能对模型的定义关系执行 withCount()
。
然而,一段关系可以是 hasManyThrough
可以实现您所追求的目标。
class Tutorial extends Model
{
function chapters()
{
return $this->hasMany('App\Chapter');
}
function videos()
{
return $this->hasManyThrough('App\Video', 'App\Chapter');
}
}
然后你可以做:
Tutorial::withCount(['chapters', 'videos'])
文档:
模型结构如下
教程 -> (hasMany) 章节 -> (hasMany) 视频
我们如何使用 laravel 5.3 的 withCount() 方法从教程模型中加载视频数 (video_count)
我试过:
Tutorial::withCount('chapters')
->withCount('chapters.videos') // this gives error: Call to undefined method Illuminate\Database\Query\Builder::chapters.videos()
->all();
编辑
这行得通,还有更好的解决方案吗?
Tutorial::withCount('chapters')
->with(['chapters' => function($query){
$query->withCount('videos');
}])
->all();
您只能对模型的定义关系执行 withCount()
。
然而,一段关系可以是 hasManyThrough
可以实现您所追求的目标。
class Tutorial extends Model
{
function chapters()
{
return $this->hasMany('App\Chapter');
}
function videos()
{
return $this->hasManyThrough('App\Video', 'App\Chapter');
}
}
然后你可以做:
Tutorial::withCount(['chapters', 'videos'])
文档: