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 на основе переданных параметров запроса. Таким образом, я думаю, вы сохраните столь необходимую модульность и избежите грязных хаков.

Другие вопросы по тегам