如何在 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 查询构建器 - 如何按别名分组,或进行原始 groupBy
如何在 Laravel 7 中使用原始 SQL 查询创建范围?
在执行查询之前,如何从 Laravel 的查询构建器中获取原始查询字符串?