Laravel计算集合中的集合(带过滤器)

时间:2018-06-16 15:25:36

标签: laravel

这里有两个问题......

假设我有两个模型OwnerDog,所有者可以拥有多只狗。这些狗也有一种颜色的场地。

我让所有的主人都带着狗,

$owners = Owner::with('dogs')->get();

1。如何获得狗的总数?

使用$owners收集者,我想要返回狗的总数。

我可以将一个count属性添加到所有者模型中并对其求和,但还有另一种方法吗?

2。如何获得黑狗的总数?

我还希望获得color黑色的狗的总数。

由于

1 个答案:

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