Я пытаюсь связать одно значение с некоторым параметром в необработанном запросе (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();
Но похоже, что Laravel выбрасывает 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
вы можете вместо этого использовать другие функции построителя запросов и whereRaw
строить запрос, используя параметр, поступающий из переменной:
$id = 2; DB::table('users') ->select('id') ->where('id', '>', $id) ->orWhere('id', '<', $id) ->orWhere('id', $id') ->first();
Конструктор запросов является достаточно мощным, и для получения более сложной логики вы можете закрывать блокировки. Для некоторых примеров см. Соответствующий раздел документации .