2017-05-11 27 views
0

我會盡我所能解釋我的問題。我與另一個實體的信息稱爲回覆(一個消息可以有零或正回覆),我要考慮到以下情況:QueryBuilder與一對多的關係和使用Doctrine的幾個條件

  1. 如果用戶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; 
    

    我不是教條的專家樓查詢,我不知道如何控制我的所有的情況下,現在,如果有人可以幫助我會非常感謝

    +0

    不應該'getReplies()'已經有每個回覆,因爲它是一個關係?也許自我引用關係可以幫助你變得更加動態。在教條頁面中,他們使用'User'作爲例子。有時你想擁有「朋友」,這也只是「用戶」對象。所以你可以使用用戶對象作爲自我引用。回覆也是一個消息,所以我相信你也可以自我引用它,並且使用symfony的力量,你應該很容易獲得數據。 –

    回答

    1

    這就是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(); 
    
    0

    不要在你AppBundle\Repository\MessageRepository庫使用->getResult();,becose有時你需要用他MENY倍,例如:BreadcrumbsBundle需要查詢(而不是導致,еhis通過性能的影響)

    相關問題