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

名前付きパラメーターを使用します。これらについては、データベース ページの「Raw 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();

しかし、LaravelQueryExceptionはメッセージとともに をスローするようです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 に答える