QueryBuilder与一对多的关系和使用Doctrine的几个条件
问题描述:
我会尽我所能解释我的问题。我与另一个实体的信息称为回复(一个消息可以有零或正回复),我要考虑到以下情况:QueryBuilder与一对多的关系和使用Doctrine的几个条件
- 如果用户A已经一个消息创建用户B(用户A是创造者) 但用户B没有回复的消息,我不想得到消息
- 同上,但用户B回复了消息。我想和其回复得到 消息,如果答复存在
- 如果用户B发送的消息给用户A,我想与 其答复如果得到的消息答复存在
我的消息实体(我只是把一对多relantionship):
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
/**
* @ORM\Table(name="messages")
* @ORM\Entity
* @ORM\Entity(repositoryClass="AppBundle\Repository\MessageRepository")
*/
class Message {
/**
* @ORM\OneToMany(targetEntity="ReplyMessage", mappedBy="message")
*/
private $replies;
/**
* Add replies
*
* @param \AppBundle\Entity\ReplyMessage $replies
* @return Message
*/
public function addReply(\AppBundle\Entity\ReplyMessage $replies)
{
$this->replies[] = $replies;
return $this;
}
/**
* Remove replies
*
* @param \AppBundle\Entity\ReplyMessage $replies
*/
public function removeReply(\AppBundle\Entity\ReplyMessage $replies)
{
$this->replies->removeElement($replies);
}
/**
* Get replies
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getReplies()
{
return $this->replies;
}
而且码T帽子我使用来实现我的目标是:
$query = $this->createQueryBuilder('message')
->where('message.creator = :username or message.receiver = :username')
->leftJoin('message.replies', 'replies')
->andWhere('replies.user = :username')
->setParameter('username', $username)
->getQuery();
$sent = $query->getResult();
return $sent;
我不是教条的专家楼查询,我不知道如何控制我的所有的情况下,现在,如果有人可以帮助我会非常感谢
答
这就是QueryBuilders的美妙之处。你可以这样创建语句:
$query = $this->createQueryBuilder('message')
->where('message.creator = :username or message.receiver = :username')
->leftJoin('message.replies', 'replies')
->andWhere('replies.user = :username')
->setParameter('username', $username);
if (some_condition) {
$query->andWhere('some_property');
}
if (some_other_condition) {
$query->andWhere('some_property');
}
return $query->getQuery()->getResults();
答
不要在你AppBundle\Repository\MessageRepository
库使用->getResult();
,becose有时你需要用他MENY倍,例如:BreadcrumbsBundle
需要查询(而不是导致,еhis通过性能的影响)
不应该'getReplies()'已经有每个回复,因为它是一个关系?也许自我引用关系可以帮助你变得更加动态。在教条页面中,他们使用'User'作为例子。有时你想拥有“朋友”,这也只是“用户”对象。所以你可以使用用户对象作为自我引用。回复也是一个消息,所以我相信你也可以自我引用它,并且使用symfony的力量,你应该很容易获得数据。 –