我有以下表格,用户,项目和图像。
用户与项目和图像有一对多的关系。每个项目和图像都归用户所有。
项目与图像有很多关系。因此,每个项目可以有许多图像,并且图像可以出现在许多项目中。
我想编写一个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
,那么它可以正常工作,但结果是错误的。它返回所有图像,即使它们确实存在于项目中。
答案 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 EXISTS
和MEMBER 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);