2013-05-20 3 views
0

С помощью этого SQL-заявление, я могу извлечь последние сообщения от всех пользователей:DQL INNER JOIN с Zend Framework 2/Doctrine 2

SELECT m1.* 
FROM message AS m1 
INNER JOIN user 
    AS u1 
    ON m1.sender_id = u1.user_id 
INNER JOIN (
    SELECT sender_id, 
    MAX(dateSent) MaxDate 
    FROM  message 
    WHERE receiver_id = 4 
    GROUP BY sender_id 
) AS m2 
ON m1.sender_id = m2.sender_id 
AND m1.datesent = m2.MaxDate; 

Это мои Сущности в моей Zend Framework 2 приложения:

Во-первых, я получил сообщение. Пользователь может отправлять сообщение другому пользователю.

/** 
* @ORM\Entity 
* @ORM\Table(name="message") 
*/ 
class Message 
{ 
/** 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
* @ORM\Column(type="integer") 
*/ 
private $id; 

/** 
* @ORM\ManyToOne(targetEntity="Application\Entities\User", inversedBy="messagesSent") 
* @ORM\JoinColumn(referencedColumnName="user_id") 
*/ 
private $sender; 

/** 
* @ORM\ManyToOne(targetEntity="Application\Entities\User", inversedBy="messagesReceived") 
* @ORM\JoinColumn(referencedColumnName="user_id") 
*/ 
private $receiver; 

/** 
* @ORM\Column(type="string", length=1024) 
*/ 
private $message; 

И лицо пользователя здесь:

/** 
* @ORM\Entity 
* @ORM\Table(name="user") 
*/ 
class User 
{ 
/** 
* @var int 
* @ORM\Id 
* @ORM\Column(type="integer") 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
protected $user_id; 

Я попытался перевести этот SQL в DQL и получил это:

SELECT m1.* 
FROM Application\Entities\Message AS m1 
INNER JOIN Application\Entities\User AS u1 
    WITH m1.sender_id = u1.user_id 
INNER JOIN (
    SELECT sender_id, 
    MAX(dateSent) MaxDate 
    FROM Application\Entities\Message 
    WHERE receiver_id = 4 
    GROUP BY sender_id 
) AS m2 
WITH m1.sender_id = m2.sender_id 
AND m1.datesent = m2.MaxDate; 

Если я выполнить его, я получаю ошибка от Доктрины:

[Semantical Error] line 0, col 206 near '(
     ': Error: Class '(' is not defined. 

Что я сделал не так?

ответ

0

Подзапросы недоступны в доктрине (насколько я знаю) в DQL (от this). Можете ли вы написать query builder?

public function innerJoin($join, $alias = null, $conditionType = null, $condition = null); 

См Reference