Laravel query builder parameter binding Laravel query builder parameter binding php php

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.