2017-10-24 24 views
1

私は2つの異なる結果を結合するDQLを変更しようとしています:は、2つの異なるDQLを組み合わせ

class ContentRepository extends EntityRepository 
{ 
    /** 
    * @param string $userId 
    * @return array 
    */ 
    public function findOwnerReadByUserId(string $userId): array 
    { 
     $qb = $this->createQueryBuilder('c'); 
     $qb->select('c') 
      ->innerJoin('c.reactions', 'rea', Join::WITH, $qb->expr()->eq('rea.content', 'c.id')) 
      ->where('c.userId = :userId') 
      ->orderBy('rea.createdAt', 'DESC') 
      ->setParameters(['userId' => $userId]); 

     return $qb->getQuery()->getResult(); 
    } 

    /** 
    * @param string $userId 
    * @return array 
    */ 
    public function findOtherReadByUserId(string $userId): array 
    { 
     $qb = $this->createQueryBuilder('c'); 
     $qb->select('c') 
      ->innerJoin('c.receivers', 'rec', Join::WITH, $qb->expr()->eq('rec.userId', ':userId')) 
      ->innerJoin('c.reactions', 'rea', Join::WITH, $qb->expr()->eq('rea.content', 'c.id')) 
      ->where('rec.read = :read') 
      ->orderBy('rea.createdAt', 'DESC') 
      ->setParameters(['userId' => $userId, 'read' => true]); 

     return $qb->getQuery()->getResult(); 
    } 
} 

両方のクエリが魅力のように働いているが、私は理由により、オーダーのarray_mergeを避けたいです。単一のDQLで両方の結果を取得するための提案はありますか?

SQLfiddle Link

+0

を持っていますか? –

+0

@AlexBlex実際には公開されていない関数は標準クラスリポジトリにあります – Mauro

+0

@AlexBlexどのようにして1つのクエリでそれを行うのですか? – Mauro

答えて

1

これが答えです@AlexBlex

のおかげ:あなたは、単一のDQLを書いて任意の特定の問題を

/** 
    * @param string $userId 
    * @return array 
    */ 
    public function findNotPendingByUserId(string $userId): array 
    { 
     $dql = <<<DQL 
    SELECT DISTINCT c 
    FROM ApiBundle:Content c 
    INNER JOIN c.receivers rec 
    INNER JOIN c.reactions rea 
    WHERE (rec.read = true AND (c.userId = :userId OR rec.userId = :userId)) 
    ORDER BY rea.createdAt DESC 
DQL; 

     return $this->getEntityManager() 
      ->createQuery($dql) 
      ->setParameters(['userId' => $userId]) 
      ->getResult(); 
    } 
関連する問題