通过表达式在 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;
};