Laravel DB:select()需要组中的所有列

时间:2019-03-22 09:36:21

标签: php laravel eloquent mariadb

我需要运行自定义查询,并且已经尝试了所有这些方法

$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

3 个答案:

答案 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);

我很想知道您的数据库结构是什么。