10

我正在尝试将相同的值绑定到原始查询中的某个参数(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] 中重复值)?

4

2 回答 2

15

使用命名参数。它们包含在数据库页面的运行原始 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();

查询构建器非常强大,要获得更复杂的逻辑,您可以嵌套闭包。有关一些示例,请参阅文档的相关部分。

于 2016-03-13T09:49:30.167 回答
1

正如@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 => trueconfig/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

于 2021-12-08T15:16:07.727 回答