Yii2 SqlDataProvider有条件地设置params

时间:2017-12-11 14:50:53

标签: sql parameters yii2 parameterbinding csqldataprovider

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

1 个答案:

答案 0 :(得分:0)

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

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