2015-03-13 2 views
0

this question. Что-то не так, при использовании CDbMigration::update() внутри цикла foreach.CDbMigration :: обновление не работает внутри цикла foreach

Этот код не работает правильно:

//This is executed inside Yii migration, so $this is CDbMigration. 

foreach($idMap as $menuId=>$pageId) 
{ 
    $this->update 
    (
     'menus_items', 
     array('link'=>'/content/show?id='.$pageId), 
     array('id = '.$menuId) 
    ); 
} 

Для каждого элемента в $ IDMAP стоимости $ PageId всегда то же и равна стоимости последний пункт в $ IDMAP массив. Поэтому каждый пункт меню указывает на тот же URL.

Этот код работает как шарм:

foreach($idMap as $menuId=>$pageId) 
{ 
    $sql = "UPDATE `menus_items` SET link = '/content/show?id=".$pageId."' WHERE id = ".$menuId."; "; 

    Yii::app()->db->createCommand($sql)->execute(); 
} 

Для каждого элемента в $ IDMAP стоимости $ PageId всегда отличается и равна стоимости текущего элемента в IDMAP$ массив. Поэтому каждый пункт меню указывает на правильный URL.

То же самое, при выполнении всех операторов в один SQL запрос:

$sql = ''; 

foreach($idMap as $menuId=>$pageId) 
{ 
    $sql .= "UPDATE `menus_items` SET link = '/content/show?id=".$pageId."' WHERE id = ".$menuId."; "; 
} 

Yii::app()->db->createCommand($sql)->execute(); 

Опять же, все в порядке.

Почему использование CDbMigration::update() не удается, а прямое выполнение SQL работает как шарм?

ответ

1

Я не думаю, что вы правильно предоставляете параметры параметров @array('id = '.$menuId) . Вы должны использовать строку, если вы хотите отправить ее так, чтобы положить ее в массив, предполагая, что вы определяете условия в паре key => value. Также вы должны обернуть ограничение значения в кавычки id = "$menuId".

Смежные вопросы