我需要执行以下查询(使用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推进方法,我想它可以为我工作,但无法弄清楚如何。
有没有办法(我知道有但我不知道)在单一查询中做所有这些事情?
答案 0 :(得分:3)
您应该建立两个标准:
// 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。