Laravel query builder parameter binding
Use named parameters. They're covered in the documentation in the Running Raw SQL Queries section of the Database page, under the subheading Using Named Bindings. Quoting:
Instead of using
?
to represent your parameter bindings, you may execute a query using named bindings:
$results = DB::select('select * from users where id = :id', ['id' => 1]);
In your case you ought to be able to run this:
DB::table('users as u') ->select('id') ->whereRaw('u.id > :id or u.id < :id or u.id = :id', [ 'id' => 2, ]) ->first();
But it seems Laravel throws a QueryException
with the message Invalid parameter number
. I've reported this as a bug.
If you really want to use whereRaw
you could instead build your array of parameters from a variable:
$id = 2;DB::table('users as u') ->select('id') ->whereRaw('u.id > ? or u.id < ? or u.id = ?', [ $id, $id, $id, ]) ->first();
Or use array_fill
to repeat the value for you:
$id = 2;DB::table('users as u') ->select('id') ->whereRaw('u.id > ? or u.id < ? or u.id = ?', array_fill(0, 3, $id)) ->first();
If you don't need whereRaw
you can instead use other features of the query builder and build the query bit by bit, with the parameter coming from a variable:
$id = 2;DB::table('users') ->select('id') ->where('id', '>', $id) ->orWhere('id', '<', $id) ->orWhere('id', $id) ->first();
The query builder is quite powerful, and to get more complicated logic you can nest closures. See the relevant section of the docs for some examples.