这里有两个问题......
假设我有两个模型Owner
和Dog
,所有者可以拥有多只狗。这些狗也有一种颜色的场地。
我让所有的主人都带着狗,
$owners = Owner::with('dogs')->get();
使用$owners
收集者,我想要返回狗的总数。
我可以将一个count属性添加到所有者模型中并对其求和,但还有另一种方法吗?
我还希望获得color
黑色的狗的总数。
由于
答案 0 :(得分:2)
Eloquent查询构建器上有一个名为withCount($relation)
的特殊功能,它基本上与$model->relation()->count()
相同。不同之处在于,它急切地为集合中的所有模型加载计数,从而产生更好的性能。
$owners = Owner::withCount([
'dogs as dog_count',
'dogs as black_dog_count' => function($query) {
$query->where('color', 'black')
},
])->get();
急切加载关系计数不会加载关系本身。当然,您也可以将with('dogs')
链接到该函数。
你也可以添加类附加'dog_count','black_dog_count',
class Owner extends Model
{
protected $appends = [
'dog_count',
'black_dog_count',
];
public function getDogCountAttribute()
{
return $this->dogs->count();
}
public function getBlackDogCountAttribute()
{
return $this->dogs->where('color', 'black')->count();
}
}
使用
$owners = Owner::with('dogs')->get();
$allDogsCount = $owners->sum('dog_count');
$allBlackDogsCount = $owners->sum('black_dog_count');
或
$allDogsCount = $owners->sum(function ($owner) {
return $owner->dogs->count();
});
$allBlackDogsCount = $owners->sum(function ($owner) {
return $owner->dogs->where('color', 'black')->count();
});