Laravel 集合中的LAVEL计数集合(带筛选器)

Laravel 集合中的LAVEL计数集合(带筛选器),laravel,Laravel,这里有两个真实的问题 假设我有两种型号的狗,一个主人可以养很多只狗。狗也有一个字段“颜色” 我让所有的主人都养狗 $owners = Owner::with('dogs')->get(); 1.如何获得狗的总数? 使用$ownersCollection,我想返回狗的总数 我可以将count属性添加到owners模型并求和,但是还有其他方法吗 2.如何获得黑狗的总数? 我还想得到黑色的狗的总数 谢谢在雄辩的查询生成器上有一个名为withCount($relation)的特殊函数,它与$mo

这里有两个真实的问题

假设我有两种型号的狗,一个主人可以养很多只狗。狗也有一个字段“颜色”

我让所有的主人都养狗

$owners = Owner::with('dogs')->get();
1.如何获得狗的总数? 使用
$owners
Collection,我想返回狗的总数

我可以将count属性添加到owners模型并求和,但是还有其他方法吗

2.如何获得黑狗的总数? 我还想得到黑色的狗的总数


谢谢

在雄辩的查询生成器上有一个名为
withCount($relation)
的特殊函数,它与
$model->relation()->count()
基本相同。不同之处在于,它会加载集合中所有模型的计数,从而产生更好的性能

$owners = Owner::withCount([
    'dogs as dog_count',
    'dogs as black_dog_count' => function($query) {
        $query->where('color', 'black')
    },
])->get();
立即加载关系计数不会加载关系本身。当然,您也可以将
与('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');


雄辩的查询生成器上有一个特殊的函数,名为
withCount($relation)
,它的功能基本上与
$model->relation()->count()
相同。不同之处在于,它会加载集合中所有模型的计数,从而产生更好的性能

$owners = Owner::withCount([
    'dogs as dog_count',
    'dogs as black_dog_count' => function($query) {
        $query->where('color', 'black')
    },
])->get();
立即加载关系计数不会加载关系本身。当然,您也可以将
与('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');


我不完全确定,但如果您通过
和('dogs')
加载完整关系,那么使用
$owner->dogs->count()
可能会更有效,并避免对数据库进行额外查询。可以使用
$owner->dogs->where('color','black')->count()
获取黑狗的数量。但是如上所述,我不知道哪一个更快。这很可能还取决于其他约束条件,例如,数据库中有哪些可用索引等。很抱歉恢复了您的
color
fix,我已经编写了我的编辑,忽略了您的编辑。编辑后更有意义!没有想到在查询阶段获取数据。虽然它没有回答我的问题(使用集合获取计数),但它确实实现了我所需要的。将等待,看看是否有人张贴任何其他答案。干杯我使用Model的appends属性更新了我的答案。您是不想得到所有的狗数,还是只想得到用户的狗数?我不完全确定,但是如果您通过
和('dogs')
加载完整的关系,那么使用
$owner->dogs->count()
可能会更有效,并避免对数据库的额外查询。可以使用
$owner->dogs->where('color','black')->count()
获取黑狗的数量。但是如上所述,我不知道哪一个更快。这很可能还取决于其他约束条件,例如,数据库中有哪些可用索引等。很抱歉恢复了您的
color
fix,我已经编写了我的编辑,忽略了您的编辑。编辑后更有意义!没有想到在查询阶段获取数据。虽然它没有回答我的问题(使用集合获取计数),但它确实实现了我所需要的。将等待,看看是否有人张贴任何其他答案。干杯我使用模型的appends属性更新了我的答案。你是想得到所有的狗数,还是只得到用户的狗数??