【问题标题】:Laravel DB query builder left join with related countsLaravel DB 查询构建器与相关计数左连接
【发布时间】:2019-06-07 06:14:18
【问题描述】:

我是 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() 必须是数组类型,给定字符串。

任何帮助将不胜感激。 提前致谢。

【问题讨论】:

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


    【解决方案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; 
    }
    

    【讨论】:

    • 谢谢,但不幸的是它也抛出了一个错误,然后从 database.php 文件中禁用了严格,现在它工作正常。
    • 用 2 个替代解决方案编辑了我的答案。我建议不要关闭严格。
    猜你喜欢
    • 2017-03-09
    • 1970-01-01
    • 2017-02-15
    • 2021-12-30
    • 1970-01-01
    • 2017-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多