2013-04-24 94 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); 

但是,這並不是什麼幫助你的情況下,因爲選擇的標準條件的變化在每個更新實例中爲你。也許你可以將上面的代碼放在循環遍歷你的數組的循環中。

更新:

你可以嘗試破解的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 2013-04-25 02:27:02

+0

如果你找到一種方法來在你的鏈接中執行MySql命令,這將是很好的瞭解。我從來沒有見過與Symfony 1捆綁在一起的Propel版本。*儘管支持這些類型的命令。我實際上已經發現那些早期版本是相當有限制的,尤其是對於它們對連接的支持等。 希望你找到一種方法。 – antony 2013-04-25 06:21:25

+0

我添加了一個propel hack,可能工作。 – antony 2013-04-25 07:35:07

相關問題