没有不值得去解决的问题,也没有不值得去学习的技术!

在 Laravel 9 中使用原生表达查询时,in 条件用于多个字段

查看生成的 SQL,符合预期
1、参考:在 MySQL 8 中,in 条件用于多个字段 。


SELECT * FROM `customers` WHERE ( name, email ) IN (( '123', '123@outlook.com' ),
( '我是客户姓名33', '1303842899@qq.com' ))


2、需要在 Laravel 9 中使用原生表达查询时,in 条件用于多个字段。whereRaw 和 orWhereRaw 方法将原生的「where」注入到你的查询中。


$customers = DB::table('customers')
	->whereRaw('email in ?', ['(\'123@outlook.com\', \'12414dfgfdg@78.com\')'])
	->get();
print_r($customers);exit;


3、执行报错:SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘?’ at line 1 。如图1
执行报错:SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?' at line 1
图1


"message": "SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?' at line 1 (SQL: select * from `customers` where email in ('123@outlook.com', '12414dfgfdg@78.com'))",


4、不再使用 ?,而是直接拼接出原生 SQL。查询成功。如图2
不再使用 ?,而是直接拼接出原生 SQL。查询成功
图2


$customers = DB::table('customers')
	->whereRaw('email in (\'123@outlook.com\', \'12414dfgfdg@78.com\')')
	->get();
print_r($customers);exit;


5、再次调整,以使 in 条件用于多个字段。查询成功。如图3
再次调整,以使 in 条件用于多个字段。查询成功
图3


$queryBuilder = app('Modules\Order\Models\Customer')::query();
$customers = $builder->whereRaw('(name,email) in ((\'123\',\'123@outlook.com\'),(\'我是客户姓名33\',\'1303842899@qq.com\'))')
	->get();
print_r($customers);exit;




$queryBuilder = app('Modules\Order\Models\Customer')::query();
print_r($criteria['customers']);
$str = '';
foreach ($criteria['customers'] as $key => $customer) {
	$str .= ($key == 0) ? '(\'' : ',(\'';
	$str .= implode('\',\'', $customer) . '\')';
}
print_r($str);
$customers = $builder->whereRaw('(name,email) in (' . $str . ')')->get();
print_r($customers);exit;


6、查看生成的 SQL,符合预期。如图4
查看生成的 SQL,符合预期
图4


select
  `id`,
  `name`,
  `email`,
  `type`
from
  `customers`
where
  (name, email) in (
    ('王某人', '44445@163.com'),
    ('客户姓名', '44445@163.com'),
    ('王某某', '4444@163.com'),
    ('王某某', '44445@163.com'),
    ('李某某', '4444@163.com'),
    ('客户姓名', '4444@163.com')
  )
order by
  `id` desc


7、后续发现 SQL 报错,具体可参考:在 Laravel 9 中使用原生表达查询时,报错:SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; 。

PHP / Laravel / Yii2 老项目维护与长期技术支持

如果你的 PHP / Laravel / Yii2 项目已经上线,但遇到原开发离职、Bug 长期无人修复、接口不稳定、性能下降、代码难以接手等问题,可以联系我做一次远程技术排查。

适合以下情况:
✅ 老旧 PHP 系统无人维护
✅ Laravel / Yii2 项目 Bug 修复
✅ 后台管理系统小功能迭代
✅ RESTful API 接口排查
✅ MySQL / Redis / Nginx 性能问题
✅ 长期远程兼职维护

可先从一次小问题开始:
✅ 线上报错排查
✅ 接口异常分析
✅ 慢查询与性能瓶颈定位
✅ 代码结构初步评估
✅ 部署环境与日志检查

如需咨询,请联系我,并注明:PHP 维护咨询

联系方式:
Telegram:@shuijingwan
微信:13980074657
邮箱:shuijingwanwq@gmail.com

评论

2 条对“在 Laravel 9 中使用原生表达查询时,in 条件用于多个字段”的回复

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理