我有下表:
如何使用Laravel有效地获取所有用户以及每位用户购买的图书数量。
我最接近的是:
$users = User::
->with(['books' => function ($query) {
$query->select(DB::raw('count(*) as number_of_purchased_books')
->where('purchased', '=', true);
}])
->get();
dump($users->toArray())
但上述似乎没有为number_of_purchased_books
属性返回任何内容。
我做错了什么?
答案 0 :(得分:1)
使用withCount()
。类似的东西:
User::withCount(['books' => function ($q) {
$q->where('purchased', true);
}])
->get();
此方法会计算相关图书,并会为每个books_count
对象添加User
属性。
如果您想要计算关系中的结果数而不实际加载它们,您可以使用withCount方法,该方法会在结果模型上放置
{relation}_count
列。
答案 1 :(得分:0)
您可以建立自定义关系:
public function booksCount()
{
return $this->belongsToMany('App\Models\Book')
->selectRaw('user_id, count(*) as aggregate_books')
->groupBy('user_id');
}
public function getBookCount()
{
// if relation is not loaded already, let's do it first
if (!array_key_exists('booksCount', $this->relations)) {
$this->load('booksCount');
}
$related = $this->getRelation('booksCount')->first();
// then return the count directly
return ($related) ? (int) $related->aggregate_books : 0;
}
然后可以用作:
User::with('booksCount');
答案 2 :(得分:0)
将user_id添加到您的选择中以便能够预订书籍查询
$users = User::
->with(['books' => function ($query) {
$query->select(user_id, DB::raw('count(*) as number_of_purchased_books')
->where('purchased', '=', true);
}])
->get();
dump($users->toArray())