Laravel query builder parameter binding

前端 未结 1 780
独厮守ぢ
独厮守ぢ 2020-12-19 13:28

I\'m trying to bind the same value to some parameter in a raw query (Laravel 5.2)

//this is a non practical example ,only for clarify the question

DB::table         


        
相关标签:
1条回答
  • 2020-12-19 14:00

    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.

    0 讨论(0)
提交回复
热议问题