Я пытался
$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()
.