2017-02-11 6 views
0

У меня есть этот запрос (который работает нормально).Как сделать подзапрос Entity/Table Inner Join на себя - 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.

Я попытался построить DQL-запрос, используя 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

Я решил проблему с помощью двух запросов.

Это один получает последнее сообщение в теме:

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

Это один отображает все темы:

$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);