2013-05-20 47 views
0

有了這個的SQL語句,我可以從所有用戶獲取最新消息:DQL INNER JOIN與Zend框架2 /學說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