【问题标题】:Laravel 5.4 query builder having issues with groupByLaravel 5.4 查询生成器存在 groupBy 问题
【发布时间】:2018-04-03 17:31:13
【问题描述】:

我正在尝试将此查询转换为 Laravel 5.4 中的查询生成器:

SELECT
    oc.id,
    oc.name,
    oat.user_id,
    p.first_name,
    p.last_name
FROM
    oauth_clients oc
    LEFT JOIN oauth_access_tokens oat ON oc.id = oat.client_id
    JOIN users u on u.id = oat.user_id
    JOIN people p on p.id = u.person_id
WHERE oc.revoked = false AND oc.password_client = true
GROUP BY oc.id, oat.user_id

得到这个错误提示:Argument 1 passed to Illuminate\Database\Connection::prepareBindings() must be of the type array, string given, called in /var/www/html/source/luniverse/vendor/laravel/framework/src/Illuminate/Database/Connection.php on line 648 and defined 这是我的尝试(众多尝试之一):

$tokens = DB::select('oc.id','oc.name','oat.user_id','p.first_name','p.last_name')
                ->from('oauth_clients as oc')
                ->leftJoin('oauth_access_tokens as oat', 'oc.id', '=', 'oat.client_id')
                ->join('users as u', 'u.id', '=', 'oat.user_id')
                ->join('people as p', 'p.id', '=', 'u.person_id')
                ->where('oc.revoked', '=', 'false')
                ->where('oc.password_client', '=', 'true')
                ->groupBy('oc.id')
                ->groupBy('oat.user_id')
                ->get();

数据库配置设置为严格模式,但这似乎并不能完全解释该特定错误。原始查询在 DB gui 中运行良好。

【问题讨论】:

  • sql 还是查询生成器? sql 查询运行良好,得到了我想要的。
  • 输出构建的 laravel 选择查询,并将其与您的原始查询进行比较,以尝试找出错误所在。 stackoverflow.com/questions/18236294/… 或在查询运行之前立即添加: DB::listen(function ($query) { var_dump($query->sql); var_dump($query->bindings); });

标签: php mysql laravel eloquent query-builder


【解决方案1】:

更改 groupby 代码,如

$tokens = DB::select('oc.id','oc.name','oat.user_id','p.first_name','p.last_name')
            ->from('oauth_clients as oc')
            ->leftJoin('oauth_access_tokens as oat', 'oc.id', '=', 'oat.client_id')
            ->join('users as u', 'u.id', '=', 'oat.user_id')
            ->join('people as p', 'p.id', '=', 'u.person_id')
            ->where('oc.revoked', '=', 'false')
            ->where('oc.password_client', '=', 'true')
            ->groupBy('oc.id','oat.user_id')
            ->get();

【讨论】:

  • 谢谢!这成功了,虽然我必须完全匹配选择,所以更像:->groupBy('oc.id','oc.name','oat.user_id','p.first_name','p.last_name')
【解决方案2】:

DB::select() 执行查询,你必须使用DB::table()

DB::table('oauth_clients as oc')
    ->select('oc.id','oc.name','oat.user_id','p.first_name','p.last_name')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 2016-07-21
    • 2019-03-29
    • 2017-08-13
    • 2015-08-06
    • 2021-08-11
    • 1970-01-01
    相关资源
    最近更新 更多