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 实例。这样,我认为,您将保留非常需要的模块化并避免任何肮脏的黑客攻击。
我在 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 实例。这样,我认为,您将保留非常需要的模块化并避免任何肮脏的黑客攻击。