通过表达式在 SQL 语句中动态设置参数
Dynamically set param in SQL statement via Expression
我目前使用的是Yii2框架(具体https://www.yiiframework.com/doc/api/2.0/yii-db-expression)
我 运行 遇到了在创建多个表达式语句时无法动态设置参数的问题。
$citiesArray = explode("Chicago", "New York", "Dallas");
foreach ($citiesArray as $index => $city) {
$expression = new Expression(
'JSON_CONTAINS(
field_location_addressLocation,
:city,
\'$.parts.city\'
)',
[':city' => json_encode($city)]
);
array_push($cityExpressions, $expression);
};
这里的问题是每次迭代时 :city
都被简单地替换,最终,SQL 语句转换为只关心最后一个经过的城市(在这种情况下,"Dallas").
我试过结合循环的索引来创建一个唯一值,但没有这样的运气:
foreach ($citiesArray as $index => $city) {
$expression = new Expression(
'JSON_CONTAINS(
field_location_addressLocation,
\':city-$index\',
\'$.parts.city\'
)',
[':city-'.$index => json_encode($city)]
);
array_push($cityExpressions, $expression);
};
如果这可能的话?我相信这更多是 mySQL (MariaDB) 问题而不是 Yii,因为最终这些表达式被转换为 SQL 语句。
如有任何见解,我们将不胜感激。
(我正在使用此处显示的参数文档:https://www.yiiframework.com/doc/api/2.0/yii-db-expression#$params-detail)
关于替换参数,您说得对 - 参数名称应该是唯一的。但是您错误地构建了表达式字符串 - 变量插值仅适用于 "
内的字符串。如果您使用 '
,那么 $index
将不会被视为 $index
变量内部的值,而是被视为文字字符串 $index
。试试这个:
foreach ($citiesArray as $index => $city) {
$expression = new Expression(
"JSON_CONTAINS(
field_location_addressLocation,
':city$index',
'$.parts.city'
)",
[':city' . $index => json_encode($city)]
);
$cityExpressions[] = $expression;
};
我目前使用的是Yii2框架(具体https://www.yiiframework.com/doc/api/2.0/yii-db-expression)
我 运行 遇到了在创建多个表达式语句时无法动态设置参数的问题。
$citiesArray = explode("Chicago", "New York", "Dallas");
foreach ($citiesArray as $index => $city) {
$expression = new Expression(
'JSON_CONTAINS(
field_location_addressLocation,
:city,
\'$.parts.city\'
)',
[':city' => json_encode($city)]
);
array_push($cityExpressions, $expression);
};
这里的问题是每次迭代时 :city
都被简单地替换,最终,SQL 语句转换为只关心最后一个经过的城市(在这种情况下,"Dallas").
我试过结合循环的索引来创建一个唯一值,但没有这样的运气:
foreach ($citiesArray as $index => $city) {
$expression = new Expression(
'JSON_CONTAINS(
field_location_addressLocation,
\':city-$index\',
\'$.parts.city\'
)',
[':city-'.$index => json_encode($city)]
);
array_push($cityExpressions, $expression);
};
如果这可能的话?我相信这更多是 mySQL (MariaDB) 问题而不是 Yii,因为最终这些表达式被转换为 SQL 语句。
如有任何见解,我们将不胜感激。
(我正在使用此处显示的参数文档:https://www.yiiframework.com/doc/api/2.0/yii-db-expression#$params-detail)
关于替换参数,您说得对 - 参数名称应该是唯一的。但是您错误地构建了表达式字符串 - 变量插值仅适用于 "
内的字符串。如果您使用 '
,那么 $index
将不会被视为 $index
变量内部的值,而是被视为文字字符串 $index
。试试这个:
foreach ($citiesArray as $index => $city) {
$expression = new Expression(
"JSON_CONTAINS(
field_location_addressLocation,
':city$index',
'$.parts.city'
)",
[':city' . $index => json_encode($city)]
);
$cityExpressions[] = $expression;
};