Я пытаюсь привязать одно и то же значение к некоторому параметру в необработанном запросе (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])?
Используйте именованные параметры. Они описаны в документации в Выполнение необработанных запросов 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();
Конструктор запросов достаточно мощный, и для получения более сложной логики вы можете вкладывать замыкания. Увидеть соответствующий раздел документов для некоторых примеров.
Других решений пока нет …