Как создать параметризованное заявление об обновлении базы данных в Yii для предложения IN ()?

Я пытался

$sql = "update ad_group_keyword set status = :status where google_id not in (:google_id)"; Yii::$app->db->createCommand($sql) ->bindValue(':status', Constants::DELETED) ->bindValue(':google_id', join(',',$googleIds), \PDO::PARAM_INT) ->execute(); 

но он превратил массив идентификаторов в одну гигантскую строку, несмотря на PDO::PARAM_INT . Я также пробовал

  ->bindValue(':google_id', $googleIds) 

но он дал 'Array to string conversion' in vendor/yiisoft/yii2/db/Command.php:172 . Я закончил тем, что использовал

 $sql = "update ad_group_keyword set status = :status where google_id not in (" . join(',',$googleIds) . ")"; 

Я предлагаю использовать QueryBuilder для этой функции:

 $command = Yii::$app->db->createCommand(); $result = $command->update( // create a update sql 'ad_group_keyword', // table ['status'=>1], // update set ['NOT IN', 'google_id', [1,2,3]] // where )->execute(); 

Вы можете прочитать \ Yii \ db \ Command :: update () DOC и как установить условие

Вы не должны join в этом месте. Именно там он превращается в строку. Вы хотите итерации через свой список идентификаторов и bindValue каждый из них в переменную по очереди.

Вам нужно привязать каждое из значений массива индивидуально. Что-то вроде этого:

 $ sql = "UPDATE ad_group_keyword
         Состояние SET =: статус
         WHERE google_id NOT IN (% s) ";

 $ bindValues ​​= array ();
 $ i = 0;
 foreach ($ googleIds как $ value)
 {
     $ bindValues ​​[': googleId'. $ i ++] = $ value;
 }

 $ sql = sprintf ($ sql, join (',', array_keys ($ bindValues)));
 $ sqlCommand = Yii :: $ app-> db-> createCommand ($ sql);
 $ sqlCommand-> bindValue (': status', Constants :: DELETED);

 foreach ($ bindValues ​​как $ key => $ value)
 {
     $ sqlCommand-> bindValue ($ key, $ value, \ PDO :: PARAM_INT);
 }

 $ SqlCommand-> Execute ();

Тем не менее, я только основываю этот пример на вашем коде, и я заглянул в руководство Yii, чтобы узнать, не существует ли уже никакого метода, который делает всю эту работу для вас … не должно быть так сложно безопасно выполните запрос SQL с помощью IN() .