使用Propel 1.4更新多行

时间:2012-09-05 13:40:35

标签: symfony1 symfony-1.4 propel

我需要执行以下查询(使用Propel 1.4 / Symfony 1.4)

update notification
set read=1
where to=6 AND
    action=0

为此,我在symfony 1.4中编写了以下代码

$c=new Criteria()
$c->add(NotificationPeer::TO, $memberId, Criteria::EQUAL);
$c->add(NotificationPeer::ACTION, 0, Criteria::EQUAL);
$notification = NotificationPeer::doSelect($c);

foreach($notification as $notice)
{
    $notice->setRead(1);
    $notice->save();
}

它的工作原理但如果有任何用户有100个通知,它将花费100多个查询和不必要的服务器负载。我看了doUpdate推进方法,我想它可以为我工作,但无法弄清楚如何。

有没有办法(我知道有但我不知道)在单一查询中做所有这些事情?

1 个答案:

答案 0 :(得分:3)

您应该建立两个标准:

  • 一个用于where子句
  • 另一个用于更新条款。
// Build WHERE criteria
$wherec = new Criteria();
$wherec->add(NotificationPeer::TO, $memberId, Criteria::EQUAL);
$wherec->add(NotificationPeer::ACTION, 0, Criteria::EQUAL);

// Build updated field criteria
$updc = new Criteria();
$updc->add(NotificationPeer::READ, 1);

BasePeer::doUpdate($wherec, $updc, $con);

它执行一个(可能很大)查询。请参阅this snippet