学说 - 根据多对多的计数获取项目

时间:2014-05-31 00:53:28

标签: sql symfony doctrine-orm

我有以下表格,用户,项目和图像。

用户与项目和图像有一对多的关系。每个项目和图像都归用户所有。

项目与图像有很多关系。因此,每个项目可以有许多图像,并且图像可以出现在许多项目中。

我想编写一个DQL查询来获取未包含在任何项目中的特定用户的所有图像。我可以用SQL编写。

用SQL编写最好的方法吗?

或者我应该使用DQL来执行此操作吗?

我尝试过编写DQL但是努力工作!

修改

从我的Image Repo中我现在正在做这个

$qb = $this->createQueryBuilder("i");

$qb->select("i")
    ->from('MyBundleName:User','u')
    ->innerJoin('u.images', 'user_images')
    ->where('IDENTITY(u.id) = :user_id')
    ->andWhere('NOT EXISTS (
        SELECT p
        FROM MyBundleName:Project p
        WHERE user_images MEMBER of p.images
    )')
->setParameter('user_id', $user_id);

我已将/语法替换为:我的课程,因为他们在使用/时失败了

我仍然会收到此错误;

  

[语义错误]第0行,第131行靠近'id)=:user_id':错误:   无效的PathExpression。必须是SingleValuedAssociationField。

函数createQueryBuilder需要别名,我正在传递"i" - 是吗?

我在调用"i"时再次给它select

如果我删除了innerJoin,那么它可以正常工作,但结果是错误的。它返回所有图像,即使它们确实存在于项目中。

2 个答案:

答案 0 :(得分:1)

我不能说DQL有多难,但我可以告诉你,在SQL中听起来很简单:

SELECT I.*
FROM IMAGES I
INNER JOIN USERS U ON (I.USER_ID = U.USER_ID)
WHERE NOT EXISTS (
    SELECT *
    FROM   PROJECTS P, PROJECT_IMAGES PI
    WHERE  P.USER_ID = U.USER_ID
    AND    PI.PROJECT_ID = P.PROJECT_ID
    AND    I.IMAGE_ID = PI.IMAGE_ID
)

用户拥有的图像,该图像在用户拥有的任何项目中都不存在。

答案 1 :(得分:1)

我不知道你的实体是什么样的,但考虑到这样的关系应该有效。关键是组合NOT EXISTSMEMBER OF(您希望确保所有返回的图像都不存在图像所属的项目。)

$qb->select("i")
    ->from('MyBundle\Entity\User','u')
    ->innerJoin('u.images','i')
    ->where('IDENTITY(u) = :user_id')
    ->andWhere('NOT EXISTS (
        SELECT p
        FROM MyBundle\Entity\Project p 
        WHERE i MEMBER of p.images
      )')
    ->setParameter('user_id', $user_id);