QueryBuilder与一对多的关系和使用Doctrine的几个条件

问题描述:

我会尽我所能解释我的问题。我与另一个实体的信息称为回复(一个消息可以有零或正回复),我要考虑到以下情况:QueryBuilder与一对多的关系和使用Doctrine的几个条件

  1. 如果用户A已经一个消息创建用户B(用户A是创造者) 但用户B没有回复的消息,我不想得到消息

  1. 同上,但用户B回复了消息。我想和其回复得到 消息,如果答复存在

    1. 如果用户B发送的消息给用户A,我想与 其答复如果得到的消息答复存在
    2. 我的消息实体(我只是把一对多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; 
      

      我不是教条的专家楼查询,我不知道如何控制我的所有的情况下,现在,如果有人可以帮助我会非常感谢

    开始=“3”>
开始=“2”>
+0

不应该'getReplies()'已经有每个回复,因为它是一个关系?也许自我引用关系可以帮助你变得更加动态。在教条页面中,他们使用'User'作为例子。有时你想拥有“朋友”,这也只是“用户”对象。所以你可以使用用户对象作为自我引用。回复也是一个消息,所以我相信你也可以自我引用它,并且使用symfony的力量,你应该很容易获得数据。 –

这就是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通过性能的影响)