Yii2 SqlDataProvider устанавливает параметры условно
У меня огромный запрос SQL в SqlDataProvider. Я использую простую фильтрацию, как это (это плохая практика, как это?):
!empty($_GET['Search']['A']) ? $A = $_GET['Search']['A'] : $A = "%%";
$dataProvider = new SqlDataProvider([
'sql' => '
SELECT * FROM ...
WHERE
A LIKE :A',
'params' => [
':A' => $A,
],
Это работает, но я хотел бы использовать расширенную версию:
!empty($_GET['Search']['B']) ? $B = "AND B LIKE \'%" . $_GET['Search']['B'] . "%\'" : $B = "";
$dataProvider = new SqlDataProvider([
'sql' => '
SELECT * FROM ...
WHERE
A LIKE :A
:B',
'params' => [
':A' => $A,
':B' => $B,
],
Но это не работает, потому что в окончательном SQL-запросе всегда есть одинарная кавычка в начале и в конце, а вокруг значения - двойная одинарная кавычка: 'AND B LIKE ''%something%'''
Можно ли реализовать что-то подобное, не делая полный запрос условным? (потому что я хотел бы использовать его несколько раз, как это, и это привело бы к тысячам строк, задающих команды, которых я бы хотел избежать) Заранее спасибо!
1 ответ
Прежде всего, да, вы не должны иметь прямой доступ $_GET
массив, а вместо этого использовать Yii::$app->request->get('some_param')
, Во-вторых, я думаю, что параметризованный запрос был изобретен для отдельных значений, которые необходимо экранировать, а не для условно модифицирующего оператора SQL, поэтому я не знаю, как выбросить обязательные кавычки.
Что касается самой идеи изменения запроса на лету, я хотел бы написать простую функцию, которая создает и возвращает экземпляр SqlDataProvider на основе переданных параметров запроса. Таким образом, я думаю, вы сохраните столь необходимую модульность и избежите грязных хаков.