【问题标题】:How to update multiple rows with different values using Propel ORM?如何使用 Propel ORM 更新具有不同值的多行?
【发布时间】:2013-04-24 22:19:56
【问题描述】:

如果我有一个主键数组,然后是另一个键值对标题:

$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 呼叫中更新我的文章表的方法。

【问题讨论】:

    标签: orm symfony-1.4 propel


    【解决方案1】:

    我不认为你可以。如果您考虑如何在 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 hack(未经测试):

    $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);
    

    【讨论】:

    • 感谢您的回答。其他 ORM 能够实现这种类型的 SQL 包装器。至于 MYSQL 查询的样子,它将使用 CASE 语句:link
    • 如果您找到了一种在您的链接中执行 MySql 命令的方法,那将是非常值得了解的。我从未见过那些与 Symfony 1.* 捆绑在一起的 Propel 版本支持这些命令。实际上,我发现那些早期版本的限制非常严格,尤其是它们对连接等的支持。希望你能找到一种方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-24
    • 2016-07-16
    • 2023-03-16
    • 1970-01-01
    • 2019-08-11
    • 1970-01-01
    相关资源
    最近更新 更多