我正在尝试将相同的值绑定到原始查询中的某个参数(Laravel 5.2)
//this is a non practical example ,only for clarify the question
DB::table('users as u')
->select('id')
->whereRaw('u.id > ? or u.id < ? or u.id = ?',[2,2,2])
->first();
有没有办法一次绑定相同的参数(防止在 [2,2,2] 中重复值)?
我正在尝试将相同的值绑定到原始查询中的某个参数(Laravel 5.2)
//this is a non practical example ,only for clarify the question
DB::table('users as u')
->select('id')
->whereRaw('u.id > ? or u.id < ? or u.id = ?',[2,2,2])
->first();
有没有办法一次绑定相同的参数(防止在 [2,2,2] 中重复值)?
使用命名参数。它们包含在数据库页面的运行原始 SQL 查询部分的文档中,在使用命名绑定的子标题下。报价:
您可以使用命名绑定执行查询,而不是使用
?
来表示参数绑定:$results = DB::select('select * from users where id = :id', ['id' => 1]);
在你的情况下,你应该能够运行这个:
DB::table('users as u')
->select('id')
->whereRaw('u.id > :id or u.id < :id or u.id = :id', [
'id' => 2,
])
->first();
但似乎 Laravel 抛出了一条QueryException
消息Invalid parameter number
。我已将此报告为错误。
如果您真的想使用whereRaw
,您可以改为从变量构建参数数组:
$id = 2;
DB::table('users as u')
->select('id')
->whereRaw('u.id > ? or u.id < ? or u.id = ?', [
$id, $id, $id,
])
->first();
或用于array_fill
为您重复该值:
$id = 2;
DB::table('users as u')
->select('id')
->whereRaw('u.id > ? or u.id < ? or u.id = ?', array_fill(0, 3, $id))
->first();
如果您不需要whereRaw
,您可以改用查询构建器的其他功能并逐位构建查询,参数来自变量:
$id = 2;
DB::table('users')
->select('id')
->where('id', '>', $id)
->orWhere('id', '<', $id)
->orWhere('id', $id)
->first();
查询构建器非常强大,要获得更复杂的逻辑,您可以嵌套闭包。有关一些示例,请参阅文档的相关部分。
正如@tremby 回答的那样,您可以使用
DB::table('users as u')
->select('id')
->whereRaw('u.id > :id or u.id < :id or u.id = :id',['id'=>2])
->first();
使用命名绑定。
此外,您必须设置PDO::ATTR_EMULATE_PREPARES => true
以config/database.php
消除Invalid parameter number
异常,例如:
config/database.php
'mysql' => [
'driver' => 'mysql',
...
'options' => [
PDO::ATTR_EMULATE_PREPARES => true,
],
],
参考:https ://github.com/laravel/framework/issues/12715#issuecomment-197013236