0

我需要执行以下查询(使用 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 方法,我想它可以为我工作,但无法弄清楚如何。

有什么办法(我知道有但我不知道)在单个查询中完成所有这些事情吗?

4

1 回答 1

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

它执行一个(可能很大)查询。请参阅此片段

于 2012-09-05T14:05:56.203 回答