2

私は現在Symfony2フレームワークを使用しています。Symfony2のクエリビルダーでクエリの2つを結合する方法がわかりません。SQLUNIONクエリを使用して結合できます。以下は、正しい結果を返すクエリです。

SELECT * FROM (SELECT m.id, m.subject, m.date 
FROM message m JOIN message_incoming mi ON m.id = mi.id
WHERE m.recipient_id = 1
AND mi.trash = 1
AND mi.deleted = 0) AS y
UNION 
SELECT * FROM (SELECT m.id, m.subject, m.date 
FROM message m JOIN message_outgoing mo ON m.id = mo.id
WHERE m.originator_id = 1
AND mo.trash = 1
AND mo.sent = 1
AND mo.deleted = 0) AS z
ORDER BY date DESC

正しい結果を得るために、このコードを1つのクエリ(UNIONなし)で結合しようとしましたが、失敗しました。

では、クエリビルダーを使用してこのクエリを実装するにはどうすればよいですか?

アドバイス、ありがとう。

4

2 に答える 2

2

Doctrine2 自体をハッキングせずにそのようなクエリを作成する最良の方法は、 を使用することNativeQueryです。

native/sqlQueryBuilderは、ORM とまったく同じ API を使用します。また、結果を既存のエンティティにマップできます。

于 2012-06-21T09:55:23.497 に答える
0

条件を確認せずに2つのクエリを結合するとき、私はどれほど愚かなのかわかりません。これは正しいクエリです:

SELECT m.id, m.subject, m.date
FROM message m 
JOIN message_incoming mi ON m.id = mi.id
JOIN message_outgoing mo ON m.id = mo.id
WHERE m.recipient_id = 1
AND mi .trash = 1
AND mi .deleted = 0
OR m.originator_id = 1
AND mo .trash = 1
AND mo .deleted =0
AND mo .sent = 1
ORDER by date DESC

クエリビルダーを介して実装しようとしました:

$queryBuilder = $this->entityManager->getRepository('EzxWebmailBundle:Message')
            ->createQueryBuilder('m')
            ->select('m.id','m.subject','m.date')
            ->join('m.message_outgoing','mo','ON','m.id = mo.id')
            ->join('m.message_incoming','mi','ON','m.id = mi.id')
            ->where('m.recipient_id = '.$userId)
            ->andWhere('mi.trash = 1')
            ->andWhere('mi.deleted = 0')
            ->orWhere('m.originator_id = '.$userId)
            ->andWhere('mo.trash = 1')
            ->andWhere('mo.deleted = 0')
            ->andWhere('mo.sent = 1')
            ->orderBy('m.date','DESC');
$result = $queryBuilder->getQuery()->getResult();

驚くべきことに、間違った結果が返されます。そこで、次を使用して生成されたクエリを確認しようとしました:

var_dump($queryBuilder->getQuery());

そして、この結果が得られたときに doctrine が余分な括弧を生成する理由が本当にわかりません (慎重に WHERE 句を見てください):

SELECT m.id, m.subject, m.date FROM message m 
INNER JOIN message_outgoing mo ON m.id = mo.id
INNER JOIN message_incoming mi ON m.id = mi.id
WHERE ((m.recipient_id = 1 AND mi.trash = 1 AND mi.deleted = 0) OR m.originator_id = 1) AND mo.trash = 1 AND mo.deleted = 0 AND mo.sent = 1 
ORDER BY m.date DESC

したがって、独自の括弧を追加すると、これは正しいものになるはずです:

$queryBuilder = $this->entityManager->getRepository('EzxWebmailBundle:Message')
            ->createQueryBuilder('m')
            ->select('m.id','m.subject','m.date')
            ->join('m.message_outgoing','mo','ON','m.id = mo.id')
            ->join('m.message_incoming','mi','ON','m.id = mi.id')
            ->where('(m.recipient_id = '.$userId)
            ->andWhere('mi.trash = 1')
            ->andWhere('mi.deleted = 0)')
            ->orWhere('(m.originator_id = '.$userId)
            ->andWhere('mo.trash = 1')
            ->andWhere('mo.deleted = 0')
            ->andWhere('mo.sent = 1)')
            ->orderBy('m.date','DESC')

少し愚かな感じ。

于 2012-06-21T10:11:22.607 に答える