0

主キーの配列と、タイトルの別のキーと値のペアがある場合:

$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 呼び出しで Article テーブルを更新する方法を探しています。

4

1 に答える 1

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 ループで囲むことができるかもしれません。

アップデート:

以下のような 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);
于 2013-04-24T23:07:09.410 に答える