Привязка параметров построителя запросов Laravel

Я пытаюсь привязать одно и то же значение к некоторому параметру в необработанном запросе (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])?

3

Решение

Используйте именованные параметры. Они описаны в документации в Выполнение необработанных запросов 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();

Но похоже Ларавел бросает 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();

Конструктор запросов достаточно мощный, и для получения более сложной логики вы можете вкладывать замыкания. Увидеть соответствующий раздел документов для некоторых примеров.

5

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector