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

时间:2017-05-11 03:33:24

标签: symfony doctrine entity-relationship query-builder

我会尽力解释我的问题。我有一个与另一个实体相关的消息,称为回复(一条消息可以有零或n个回复),我想考虑以下情况:

  1. 如果UserA向UserB创建了一条消息(UserA是创建者) 但是UserB没有回复我不想收到消息的消息
    1. 与上述相同,但UserB回复了该消息。我想得到 如果回复存在,则回复消息
      1. 如果UserB向UserA发送了一条消息,我想收到消息 如果回复存在,则回复
      2. 我的消息实体(我将放置OneToMany关系):

        <?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;
        }
        

        我用来实现目标的代码如下:

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

        我不是使用Doctrine构建查询的专家,而且我不知道如何控制我的所有案例,如果有人可以帮助我会非常感激

2 个答案:

答案 0 :(得分:3)

这就是QueryBuilders的美妙之处。您可以创建如下语句:

    name       amount        [New COLUMN]  
    ---------- -----------   --------------
    aa              287.66   0000028766
    bb               66      0000006600
    cc             2475.1    0000247510
    dd               214     0000021400

    (4 row(s) affected)

答案 1 :(得分:0)

不要在->getResult();存储库中使用AppBundle\Repository\MessageRepository,因为有时您需要多次使用他,例如:BreadcrumbsBundle需要查询(不是结果,这会受到性能的影响)