Yii2 SqlDataProvider 有条件地设置参数

Yii2 SqlDataProvider set params conditionally

我在 SqlDataProvider 中有一个巨大的 SQL 查询。我正在使用这样的简单过滤(这样是不好的做法吗?):

!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%''' 是否可以在不使完整查询成为条件的情况下实现类似的功能? (因为我想像这样多次使用它,这会导致数千行长命令集,这是我想避免的)提前谢谢你!

首先,是的,你不应该直接访问$_GET数组,而是使用Yii::$app->request->get('some_param')。其次,我认为参数化查询是为需要转义的单个值而发明的,而不是为有条件地修改 SQL 语句而发明的,所以我不知道要丢弃强制引号。

关于动态更改查询的整个想法,我会考虑编写一个简单的函数来构造 returns 基于传递的请求参数的 SqlDataProvider 实例。这样,我认为,您将保留非常需要的模块化并避免任何肮脏的黑客攻击。