Laravel 查询构建器 - 查询不工作但在 SQL 控制台中工作

Posted

技术标签:

【中文标题】Laravel 查询构建器 - 查询不工作但在 SQL 控制台中工作【英文标题】:Laravel Query builder - query not working but works in SQL console 【发布时间】:2017-03-15 15:36:38 【问题描述】:

我变得非常困惑,我试图通过 laravel 查询生成器运行查询,它应该可以工作,但它会抛出奇怪的错误。

我正在尝试在日期范围之间计算状态为“Won”的提示表中的记录,然后在 user_id 上加入用户表以检索用户名。

这是我的查询生成器

    $topfiveTipsters = DB::table('tips')
      ->select(DB::raw('count(status) as wincount, users.name'))
      ->join('users', 'users.id', '=', 'tips.user_id')
      ->whereBetween('tips.created_at',[$start,$end])
      ->where('status','Won')
      ->groupBy('users.id')
      ->orderBy('wincount', 'desc')
      ->get();

但是它抛出了错误

QLSTATE[42000]: 语法错误或访问冲突: 1055 'digthetip.users.name' 不在 GROUP BY 中(SQL: select count(status) as wincount, users.name from tips inner join @987654325 @ on users.id = tips.user_id 其中tips.created_at 在 2016-11-01 00:00:00 和 2016-11-02 10:39:02 和 @987654332 之间@ = 由users.id 赢得组@wincount desc)

但如果我运行确切的查询,错误已输出到 phpMyAdmin 中的 SQL 控制台,查询运行良好并返回我需要的结果。

我错过了什么吗?我对 Laravel 比较陌生,我很困惑它仍然会抛出错误。

【问题讨论】:

您能否发布您正在比较的两个 SQL 查询? 加入后可以使用addSelect laravel.com/docs/5.3/queries#selects 我试图运行的查询是这个 select count(status) as wincount, users.name from tips inner join users on users.id = tips .user_id 其中tips.created_at 在 '2016-11-01 00:00:00' 和 '2016-11-02 10:39:02' 和 status = 'Won' group by @987654345 @.id 订购 wincount desc 检查github.com/laravel/framework/issues/14997 如果在 select 中添加 users.id 会怎样? 【参考方案1】:

好的,事实证明你可以在 /app/database.php 中关闭 SQL 严格模式,这将防止错误发生。

'严格' => 假,

【讨论】:

在我看来这有点矫枉过正,当(通过阅读文档dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sql-mode-strict,激活似乎很有帮助)。作为最后一次尝试,现在更多的是好奇,如果您在原始 sql DB::raw('IGNORE count(status) as wincount 上添加“IGNORE”会发生什么? 这只是抛出以下错误 IGNORE count(status) as wincount, users.name, users.id from tips inner join u' at line 1 (SQL: select IGNORE count(status) as wincount, users.name, users.id from tips` inner join users on usersid = tips.user_id 其中tips.created_at 介于 2016-11-01 00:00:00 和 2016-11-02 11:12:53 和 status = 被@分组987654333@.id order by wincount desc 谢谢。我会尽量记住这一点,以备将来我的选择出现奇怪的问题。很高兴你解决了。 是的,这确实很不方便,但我看不到任何其他方式。 该死,要不是这个帖子我可能已经找了很久了,谢谢!

以上是关于Laravel 查询构建器 - 查询不工作但在 SQL 控制台中工作的主要内容,如果未能解决你的问题,请参考以下文章

4 个连接 + 3 个 where 子句的查询构建器正确语法(Laravel 5.7)

Laravel 查询构建器与雄辩的关系

Laravel:查询直接在 MySQL 上工作,但在 DB 上不工作 [重复]

向 Laravel 查询构建器添加自定义函数

雄辩的查询构建器laravel 5.6中的未知列

Laravel 通过属性获得雄辩的查询构建器关系