2013-04-24 2 views
0

Если у меня есть массив первичных ключей, а затем еще одно ключевое значение пары названий:Как обновить несколько строк с разными значениями с помощью Propel ORM?

$article = array(
    array('Id' => 1, 'Title' => 'New Title'), 
    array('Id' => 2, 'Title' => 'New Title2'), 
    array('Id' => 3, 'Title' => 'New Title3'), 
    array('Id' => 4, 'Title' => 'New Title4') 
); 

Я ищу способ, чтобы обновить мою статью таблицу в 1 Propel вызова.

ответ

2

Я не думаю, что вы можете. Если вы думаете о том, как это сделать в MySQL, это не будет в одном запросе. Они должны быть отдельными заявлениями, например.

UPDATE `article` SET title = "New Title" WHERE id = 1; 
UPDATE `article` SET title = "New Title2" WHERE id = 2; 

Вы, наверное, уже где, что вы можете сделать массовые обновления, которые соответствуют указанным критериям, как это:

// set the select condition criteria 
$c = new Criteria(); 
$c->add(ArticlePeer::ID, 1); 

// set the update criteria 
$update = new Criteria(); 
$update->add(ArticlePeer::TITLE, 'New Title'); 

// we need the connection for update, so get default connection 
$con = Propel::getConnection(); 

// finally, do the update 
BasePeer::doUpdate($c, $update, $con); 

Но это не собирается помочь много в вашем случае, поскольку изменения состояния выберите критерии в каждом экземпляре обновления для вас. Возможно, вы могли бы заключить вышеуказанный код в цикл for, который проходит через ваш массив.

Update:

Вы могли бы попробовать Propel взломать, как показано ниже (непроверенные):

$article = array(
    array('Id' => 1, 'Title' => 'New Title'), 
    array('Id' => 2, 'Title' => 'New Title2'), 
    array('Id' => 3, 'Title' => 'New Title3'), 
    array('Id' => 4, 'Title' => 'New Title4') 
); 

$ids = array(); 
$when = 'CASE id'; 
foreach ($article as $a) { 
    $ids[] = $a['Id']; 
    $when .= ' WHEN ' . $a['Id'] . ' THEN ' . $a['Title']; 
} 
$when .= ' END'; 

$c = new Criteria(); 
$c->add(ArticlePeer::ID, $ids, Criteria::IN); 

$update = new Criteria(); 
$update->add(ArticlePeer::TITLE, $when); 

$con = Propel::getConnection(); 

BasePeer::doUpdate($c, $update, $con); 
+0

Спасибо за ваш ответ. Другие ORM могут реализовать этот тип оболочки SQL. Что касается того, как будет выглядеть запрос MYSQL, он использовал бы оператор CASE как таковой: [link] (http://stackoverflow.com/questions/7759514/update-multiple-rows-with-different-values-in-a- single-query-mysql) – Anthony

+0

Если вы найдете способ выполнить команду MySql в своей ссылке, о которой было бы интересно узнать. Я никогда не видел тех версий Propel, которые поставляются вместе с Symfony 1. * Однако поддержка этих команд. Я на самом деле нашел эти более ранние версии весьма ограничительными, особенно с их поддержкой соединений и т. Д. Надеюсь, вы найдете способ. – antony

+0

Я добавил прокрутку, которая может работать. – antony