2015-10-16 56 views
1

我工作在3個實體的Symfony/DQL - 尋找跟2個用戶中的一排多到很多

  • 對話分開的信使系統,與會話
  • 參加者的姓名中,在對話和一個用戶,其中,所述參與者可以是所有者,主持人,或一個簡單的用戶
  • 消息,由參與者一個對話

而且我內發送之間的許多一對多關係希望找到一個Conver與用戶A和B進行配對,他們都是對話的參與者。任何想法如何? 感謝您的閱讀:)

+0

你嘗試使用[連接](http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#joins) ?你能告訴我們你到目前爲止嘗試過什麼嗎? – DevDonkey

+1

其實我還沒有做任何事,我在想它。 我最好的想法是使用Exist關鍵字。我讀過你可以使用多個WHERE使用EXIST。但是我沒有在教條中使用它。 – Despirithium

+0

我終於想出瞭如何使用SQL來解決這個問題。現在,我必須讓它使用DQL工作。 'SELECT * FROM會話 WHERE \t EXISTS( SELECT * FROM參與者WHERE participant.user_id = 3 ) 與EXISTS( SELECT * FROM參與者WHERE participant.user_id = 4 )' – Despirithium

回答

0

我花了一些時間思考,它花了我像一個該死的小時找到解決方案。這也將用於找到兩個用戶的共同朋友。

$firstParticipant = $this->_em->createQueryBuilder(); 
    $firstParticipant 
      ->select('pfirst') 
      ->from('EvoMessengerBundle:Participant', 'pfirst') 
      ->where('pfirst.user = :pfirstuser')  
      ->andWhere('pfirst.conversation = c') 
    ; 

    $secondParticipant = $this->_em->createQueryBuilder(); 
    $secondParticipant 
      ->select('psecond') 
      ->from('EvoMessengerBundle:Participant', 'psecond') 
      ->where('psecond.user = :pseconduser') 
      ->andWhere('psecond.conversation = c') 
    ; 

    $q = $this->_em->createQueryBuilder(); 

    $q 
      ->select('c') 
      ->from('EvoMessengerBundle:Conversation', 'c') 
      ->where($q->expr()->exists($firstParticipant->getDql())) 
      ->setParameter(':pfirstuser', $first) 
      ->andWhere($q->expr()->exists($secondParticipant->getDql())) 
      ->setParameter(':pseconduser', $second) 
      ->setMaxResults(1) 
     ; 

    return $q->getQuery()->getResult(); 
相關問題