Laravel DB查询构建器左连接并具有相关计数

时间:2019-01-12 16:23:08

标签: mysql laravel-5.7 laravel-query-builder

我是Laravel的新手,并且面临数据库查询构建器的问题。 我想从用户表中获取所有记录,并希望对愿望清单表中的相关愿望清单进行计数。这是我的查询。

select `users`.*, count(wishlists.id) as wishlists_count from `users` left join `wishlists` on `users`.`id` = `wishlists`.`uid` where `users`.`status` = 1 group by `wishlists`.`id`

我想用laravel查询生成器来做。这是我正在尝试的。

 $leads = DB::table('users')
            ->selectRaw('users.*', 'count(wishlists.id) as wishlists_count')
            ->leftJoin('wishlists', 'users.id', '=', 'wishlists.uid')
            ->where('users.status',1)
            ->groupBy('wishlists.id')
            ->get();

显示此错误。

  

参数2传递给Illuminate \ Database \ Query \ Builder :: selectRaw()   必须是数组类型,给定字符串。

任何帮助将不胜感激。 预先感谢。

1 个答案:

答案 0 :(得分:1)

这应该有效。在documentation中,selectRaw()的第二个参数是一个可选的绑定数组。

但是,您可以结合使用select()DB::raw()

来实现所需的功能。
$leads = DB::table('users')
   ->select('users.*', DB::raw('count(wishlists.id) as wishlists_count'))
   ->leftJoin('wishlists', 'users.id', '=', 'wishlists.uid')
   ->where('users.status',1)
   ->groupBy('wishlists.uid')
   ->get();

编辑:上面的答案是错误的。我会考虑以下替代方案。

您可以使用以下类似的子查询来实现它:

$wishlist = Wishlist::select(DB::raw('count(wishlists.id)'))
    ->whereColumn('uid', 'users.id')
    ->getQuery();

$users = User::select('users.*')
    ->selectSub($wishlist, 'wishlists_count')
    ->get(); 

或者以更简单的方式(假设您建立了wishlists关系)

Users::withCount('wishlists')->get();

foreach($users as $user) {
    echo $user->wishlists_count; 
}