【发布时间】:2015-12-26 20:11:59
【问题描述】:
我创建了一个支持用户之间私人消息的 Symfony 2 Bundle。我让他们能够从inbox 或sent 文件夹向trash 文件夹发送消息。邮件将通过isRTrash 和isSTrash 字段标记为垃圾邮件,分别由收件人和发件人标记。那是因为,作为我的数据库中的同一条消息,如果我在这里有一个字段,一个用户将其标记为垃圾,也会将其标记为另一个字段。
现在,我想让他们也可以从垃圾文件夹中delete 他们。邮件不会被删除,但与垃圾邮件类似,只是它们永远从标准用户视图中消失。我无法像这样标记它们,因为我必须标记用户发送和接收的两个消息。
我在实体的存储库中进行了以下查询:
public function delete($user, $msg)
{
$qb = $this->createQueryBuilder('a')
->update('PrivateMessageBundle:Message', 'a')
->where('a IN(:msg)')
->andwhere('a.receiver = :user AND a.isRTrash IS NOT null AND a.isRDeleted = false')->set('a.isRDeleted', true)
->orWhere('a.sender = :user AND a.isSTrash IS NOT null AND a.isSDeleted = false')->set('a.isSDeleted', true)
->setParameters(
array('user' => $user, 'msg' => $msg)
);
echo '<pre>';
\Doctrine\Common\Util\Debug::dump($qb->getQuery()->getSQL()); exit;
echo '</pre>';
return $qb->getQuery();
}
输出查询是string(196) "UPDATE message SET isRDeleted = 1, isSDeleted = 1 WHERE (id IN (?) AND (receiver_id = ? AND isRTrash IS NOT NULL AND isRDeleted = 0)) OR (sender_id = ? AND isSTrash IS NOT NULL AND isSDeleted = 0)"
我将当前登录用户和一组消息 ID 作为输入。然后,我检查垃圾箱中的邮件,未标记为已删除,当前用户为收件人或发件人,并希望将其标记为已删除。
问题是两个条件都满足了,并且SET 都被调用了,将消息的isRDeleted 和isSDeleted 标记为真,无论如何。
我非常接近,但不知道如何使这些字段单独标记,只有满足它们的条件。
同时,我正在使用 foreach 循环,但我认为使用查询可以更快地完成
$em = $this->getDoctrine()->getManager();
foreach ($msgs as $msgid) {
$msg = $messages->findOneBy(array('id' => $msgid));
if ($msg->getSender() == $this->getUser() && $msg->getIsSTrash() && $msg->getIsSDeleted() == false) {
$msg->setIsSDeleted(true);
$changedno++;
} else if ($msg->getReceiver() == $this->getUser() && $msg->getIsRTrash() && $msg->getIsRDeleted() == false) {
$msg->setIsRDeleted(true);
$changedno++;
}
$em->flush();
}
【问题讨论】:
标签: php sql symfony doctrine-orm