2017-02-11 15 views
0

私はこのクエリを使用しています(これは問題ありません)。エンティティ/テーブルサブクエリを作成する方法内部結合 - NativeQuery/DQL Symfony 2

$sql = 'select * from ps_message p1 INNER JOIN (SELECT MAX(p2.id) as max_id FROM ps_message p2 GROUP BY p2.thread_id) as max_table on p1.id = max_table.max_id'; 

私はSymfony2プロジェクト用に変換したいと思っています。

私はcreateQueryBuilder()とネイティブクエリーをResultSetMapping()/ ResultSetMappingBuilder()で作成しようとしましたが、まだ成功していません。

P.S. ResultSetMapping()を使用すると、関連フィールドを取得できません。私はaddJoinedEntityResult()などを試してみました。

$rsm = new ResultSetMapping(); 
$rsm->addEntityResult('BaseBundle:PsMessage', 'p1'); 
$rsm->addFieldResult('p1', 'id', 'id'); 
$rsm->addFieldResult('p1', 'message_text', 'messageText'); 
$rsm->addFieldResult('p1', 'message_type', 'messageType'); 
$rsm->addFieldResult('p1', 'receiver_message_status', 'receiverMessageStatus'); 
$rsm->addFieldResult('p1', 'sender_message_status', 'senderMessageStatus'); 
$rsm->addFieldResult('p1', 'created_date', 'createdDate'); 
$rsm->addFieldResult('p1', 'modified_date', 'modifiedDate'); 

$rsm->addFieldResult('t1', 'thread_id', 'thread_id'); //Error 
$rsm->addFieldResult('u', 'sender_id', 'sender'); //Error 
$rsm->addFieldResult('t', 'thread_id', 'thread'); //Error 
$rsm->addFieldResult('p2', 'thread_id', 'thread'); //Error 

$sql = 'select * from ps_message p1 INNER JOIN (SELECT MAX(p2.id) as max_id FROM ps_message p2 GROUP BY p2.thread_id) as max_table on p1.id = max_table.max_id'; 
$query = $em->createNativeQuery($sql, $rsm); 

答えて

0

2つのクエリを使用して問題を解決しました。

$qb = $em->createQueryBuilder() 
->select('message') 
->from('BaseBundle:PsMessage', 'message') 
->where('message.receiver = :id') 
->orWhere('message.sender = :id') 
->andWhere('message.id in (:maxIds)') 
->orderBy('message.modifiedDate', 'desc') 
->setParameter('id', $userId) 
->setParameter('maxIds', $messages_max); 

$messages_max = $em->createQueryBuilder() 
->select('max(m.id) as id') 
->from('BaseBundle:PsMessage', 'm') 
->groupBy('m.thread') 
->getQuery() 
->getResult(); 

はこの1つは、すべてのスレッドを表示します。

この1つのスレッドの最新のメッセージを取得します

関連する問題