DQL中的嵌套查询

时间:2015-06-21 16:13:08

标签: doctrine dql nested-queries nested-query

我首先想知道DQL中是否允许嵌套查询。我发现至少部分是(参见here)。所以我想知道他们是否可以做我需要的。

情况如下:我有表ProjectNotification,其中包含所有项目和所有用户的所有通知。然后我有一个UserXNotification表,我存储了给定用户已读过的通知的ID。我希望能够提取每个项目的未读通知总数(不是由当前用户发起)。以下查询有效(没有内部选择)。但是这个给出了错误。

        $query = $em->createQuery(
                                  'SELECT IDENTITY (n.project), COUNT(n.id) 
                                  FROM AppBundle:ProjectNotification n
                                  WHERE n.project IN (:projectIDs)
                                  AND n.user <> :user
                                  AND n.id NOT IN (
                                    SELECT uxn.projectNotification
                                    FROM AppBundle:UserXNotification uxn
                                    WHERE uxn.user = :user
                                    AND uxn.read = false
                                    )
                                  GROUP BY n.project
                                  ')->setParameter('projectIDs', $projectIDs)
                                    ->setParameter('user', $user);
        $notifQueryResult = $query->getResult();

具体错误是:

QueryException: [Semantical Error] line 0, col 354 near 'projectNotification': Error: Invalid PathExpression. Must be a StateFieldPathExpression.

为了完整性,这里是UsersXNotifications实体:

class UserXNotification
{
/**
 * @ORM\Column(type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
protected $id;

/**
 * @ORM\ManyToOne(targetEntity="User")
 */
protected $user;

/**
 * @ORM\ManyToOne(targetEntity="ProjectNotification")
 */
protected $projectNotification;

/**
 * @ORM\Column(type="boolean")
 */
protected $readStatus;

这是ProjectNotification实体

class ProjectNotification
{
/**
 * @ORM\Column(type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
protected $id;

// SOME IRRELEVANT FIELDS    

/**
 * @ORM\ManyToOne(targetEntity="Project")
 */    
protected $project;

/**
 * @ORM\ManyToOne(targetEntity="User")
 */    
protected $user;

实际上我写的第一个版本的查询有SELECT uxn.projectNotification.id而不是SELECT uxn.projectNotification,但它给了我这个错误:

QueryException: [Semantical Error] line 0, col 378 near 'id': Error: Class AppBundle\Entity\UserXNotification has no field or association named projectNotification.id 

我也尝试过:

...
AND n NOT IN (
     SELECT uxn.projectNotification

无济于事。 我知道内部查询是检索对象,这就是我最后一次尝试的原因。这种情况的错误是:

QueryException: [Semantical Error] line 0, col 355 near 'projectNotification': Error: Invalid PathExpression. Must be a StateFieldPathExpression. 

我希望在不必写入native sql和水合物的情况下可行:/

任何提示?

0 个答案:

没有答案