如何在 Laravel 中运行原始查询

Posted

技术标签:

【中文标题】如何在 Laravel 中运行原始查询【英文标题】:How to run raw query in Laravel 【发布时间】:2021-06-24 23:24:55 【问题描述】:

如何在 Laravel 中编写以下原始查询

 $result=  DB::select('SELECT a.awb_number,a.full_awb_number,a.service_type, b.city AS From_city, c.country_code AS From_country, b.city AS To_city, c.country_code AS To_country, datediff( max(s.created_at), min(s.created_at)) as Aging FROM customer_shippments a LEFT JOIN addresses b ON a.from_address = b.id LEFT JOIN addresses c ON a.to_address = c.id LEFT JOIN statuses s ON s.awb_number = a.awb_number WHERE a.full_awb_number IN ("LA172827289EE", "LA172828854EE", "LA172829894EE") GROUP BY s.awb_number');
   return $result;

在执行上述查询时,我收到以下错误

SQLSTATE[42000]: Syntax error or access violation: 1055 'track.a.awb_number' isn't in GROUP BY (SQL: SELECT a.awb_number,a.full_awb_number,a.service_type, b.city AS From_city, c.country_code AS From_country, b.city AS To_city, c.country_code AS To_country, datediff( max(s.created_at), min(s.created_at)) as Aging FROM customer_shippments a LEFT JOIN addresses b ON a.from_address = b.id LEFT JOIN addresses c ON a.to_address = c.id LEFT JOIN statuses s ON s.awb_number = a.awb_number WHERE a.full_awb_number IN ("LA172827289EE", "LA172828854EE", "LA172829894EE") GROUP BY s.awb_number)

【问题讨论】:

你使用什么 DBMS? mysql 数据库管理 【参考方案1】:

如果您有参数,可能会发生此错误 'strict' => true 在 config/database.php 中为您提供数据库连接。

您可以将此参数设置为 false,或更改您的查询,以便“select”中的所有字段都表示在“group by”中

【讨论】:

我已将参数 'strict'=> 设置为 false 但不起作用 @user5370838,请检查一下,也许您的数据库设置有ONLY_FULL_GROUP_BY 参数。要检查这一点,请运行 SELECT @@sql_mode; 查询并检查结果是否为 ONLY_FULL_GROUP_BY。如果有,您可以使用 SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); 查询禁用此功能 @ Andrew Markhai 我用这个原始查询试过了,先生....tq 对你的支持非常有用 public static function getstatusData() return DB::connection('mysql')->select ('SELECT a.awb_number,a.full_awb_number,a.service_type, b.city AS From_city, b.city AS To_city, datediff( max(s.created_at), min(s.created_at)) 作为 Aging FROM customer_shippments a LEFT JOIN地址 b ON a.from_address = b.id WHERE a.full_awb_number IN ("LA172827289EE", "LA172828854EE", "LA172829894EE") GROUP BY s.awb_number'); 【参考方案2】:

使用 DB::raw(),但在使用 DB::raw 之前尝试先清理数据以防止 SQL 注入

$result = DB::raw('select blablabla')->get();
return $result;

Laravel Query Docs

【讨论】:

以上是关于如何在 Laravel 中运行原始查询的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Laravel 5.1 执行原始查询?

Laravel 查询构建器 - 如何按别名分组,或进行原始 groupBy

如何在 Laravel 7 中使用原始 SQL 查询创建范围?

在执行查询之前,如何从 Laravel 的查询构建器中获取原始查询字符串?

如何在执行查询之前从Laravel的查询生成器获取原始查询字符串?

如何从原始查询中检索结果集作为数组而不是 Laravel 3 中的对象