Динамически устанавливаемый параметр в выражении SQL с помощью выражения

В настоящее время я использую инфраструктуру Yii2 (в частности, https://www.yiiframework.com/doc/api/2.0/yii-db-expression )

Я сталкиваюсь с проблемой, когда я не могу динамически установить параметр при создании нескольких операторов 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 переводит только в заботу о последнем пройденном городе (в данном случае, «Даллас»).

Я попытался включить индекс цикла для создания уникального значения, но мне не повезло:

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 )

Всего 1 ответ


Вы правы насчет замены параметров - имена параметров должны быть уникальными. Но вы неправильно строите строку выражения - интерполяция переменных будет работать только со строками внутри " . Если вы используете ' , то $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;
};