User和(和)中的Group实体之间的标准ManyToMany单向关系。系统:Symfony 2.5,Doctrine 2.4。FOSUserBundle``SonataUserBundle
User
Group
FOSUserBundle``SonataUserBundle
PS这不是真实的代码复制。 这是不可能的,因为有几层使用不同的配置文件以不同的格式和位置扩展,所以如果发现错误的类型,这不是问题。
namespace RAZ\UserBundle\Entity; /** * @ORM\Table(name="fos_user_user") */ class User { /** * @var integer * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; /** * @var Collection * * @ORM\ManyToMany(targetEntity="Group") * @ORM\JoinTable(name="fos_user_user_group") */ protected $groups; }
namespace RAZ\UserBundle\Entity; /** * @ORM\Table(name="fos_user_group") */ class Group { /** * @var integer * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; }
问题非常相似: 如何获得多对多关系中没有与DQL和Doctrine对应的链接实体的实体?区别在于我只需要检查一个特定的组。
有效的SQL(返回1423):
SELECT COUNT(*) cnt FROM fos_user_user u LEFT JOIN fos_user_user_group dug ON u.id = dug.user_id AND dug.group_id = 70 WHERE dug.user_id IS NULL
DQL工作不正确(返回3208):
SELECT COUNT(u) FROM RAZUserBundle:User u LEFT JOIN u.groups dug WITH dug.id = 70 WHERE dug IS NULL
问题是DQL生成不同的SQL:
SELECT COUNT(u.id) FROM fos_user_user u LEFT JOIN fos_user_user_group ug ON u.id = ug.user_id LEFT JOIN fos_user_group g ON g.id = ug.group_id AND (g.id = 70) WHERE g.id IS NULL
有什么建议?
我设法在DQL中做到的唯一方法是使用子查询:
SELECT COUNT(u) FROM RAZUserBundle:User u WHERE u.id NOT IN ( SELECT u2.id FROM RAZUserBundle:User u2 JOIN u2.groups g WITH g.id = 70 )