Laravel 5:如何计算重新关系中的项目数量

时间:2017-04-26 16:03:26

标签: laravel laravel-5 eloquent

我有下表:

  • 用户
    • ID
    • 名称
  • 书籍
    • id
    • 名称
    • USER_ID
    • 购买(bool)

如何使用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属性返回任何内容。

我做错了什么?

3 个答案:

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