我需要运行自定义查询,并且已经尝试了所有这些方法
$sql = "SELECT acd.*, DATE_FORMAT(acd.cdate, '%d/%m/%Y') cdate_disp,
GROUP_CONCAT(CONCAT_WS(', ', car.type, car.session, crd.name) SEPARATOR '<br />') rd_names,
acb.booking_status my_booking_status
FROM app_data acd
INNER JOIN crmaccounts ca ON ca.id = acd.client_crm_id
LEFT JOIN crmaccount_rdids car ON car.account_id = ca.id
LEFT JOIN crmrd_ids crd ON crd.id = car.rd_id
LEFT JOIN app_bookings acb ON acb.call_ref_id = acd.call_ref AND acb.user_id = 12391
WHERE 1=1
AND acd.client_crm_id NOT IN (select account_id from bstaff WHERE user_id=12391)
GROUP BY acd.id
ORDER BY acd.cdate, ctiming";
DB:select($sql);
抛出
Illuminate \ Database \ QueryException(42000) SQLSTATE [42000]:语法错误或访问冲突:1055'mydatabase.acd.call_ref'不在GROUP BY中(SQL:....)
DB::select($sql);
DB::raw($sql);
DB::select(DB::raw($sql));
//even with pdo
$sth = DB::getPdo()->prepare($sql);
$sth->execute();
$data = $sth->fetchAll(\PDO::FETCH_OBJ);
PDOException (42000)
SQLSTATE[42000]: Syntax error or access violation: 1055 'mydatabase.acd.call_ref' isn't in GROUP BY
似乎唯一可行的方法是在group by
中列出所有表列,这是可行的,但并不方便。
我能够直接在phpmyadmin中运行相同的查询。因此,我不确定为什么通过Laravel运行它时会要求我添加所有列。
我已经安装了MariaDB,并且Laravel和PhpMyAdmin都连接到同一实例。 Larvel版本是5.8.5。
在我也在这里提问时,请查看完整查询,但找不到任何答案-https://laracasts.com/discuss/channels/eloquent/query-runs-ok-in-phpmyadmin-but-dbselect-throws-exception
答案 0 :(得分:1)
您应该尝试在config/database.php
的mysql connection部分中禁用严格模式。
答案 1 :(得分:0)
这不是Laravel问题,而是MySQL的逻辑限制。当您将不在GROUP BY
子句中的列添加到结果集中时,结果集中的这些列可能会有不同的值。
在严格模式下执行查询时(默认情况下处于启用状态),MySQL不允许这样做,因为这可能导致意外结果。如果关闭严格模式,MySQL将使用它在这些列中找到的第一个结果。
您可以在config/database.php
的Laravel配置文件中关闭严格模式。但是,由于不可预测性,建议您更改查询。
可以在MySQL文档中找到严格模式下检查的完整列表:https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#sql-mode-strict
答案 2 :(得分:0)
我已经安装了Laravel 4.8,并且还配置了Auth。此外,我添加了两个称为角色和状态的表,并尝试了您的pdo代码-它对我来说非常有效!在这里,我输入了代码。
$sql = "SELECT *
FROM users u
INNER JOIN roles r ON r.id = u.role_id
LEFT JOIN states s ON s.id = u.state_id
WHERE 1=1
GROUP BY u.id
ORDER BY u.id ";
$sth = DB::getPdo()->prepare($sql);
$sth->execute();
$data = $sth->fetchAll(\PDO::FETCH_OBJ);
dd($data);
我很想知道您的数据库结构是什么。