我首先想知道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和水合物的情况下可行:/
任何提示?