【问题标题】:DQL INNER JOIN with Zend Framework 2 / Doctrine 2DQL INNER JOIN 与 Zend Framework 2 / Doctrine 2
【发布时间】:2013-05-20 15:26:14
【问题描述】:

使用这个 SQL 语句,我可以从所有用户那里获取最新消息:

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;

如果我执行它,我会收到来自 Doctrine 的错误:

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

我做错了什么?

【问题讨论】:

    标签: doctrine-orm zend-framework2 dql


    【解决方案1】:

    DQL(来自this)的学说(据我所知)中不提供子查询。可以写query builder吗?

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

    Reference

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-27
      • 2011-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多