Aur*_*nas 6 sql dql symfony doctrine-orm fosuserbundle
标准多对多之间的单向关系User
和Group
实体从FOSUserBundle
(和SonataUserBundle
).系统:Symfony 2.5,Doctrine 2.4.
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;
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
问题非常类似于: 如何获得多对多关系中没有与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
Run Code Online (Sandbox Code Playgroud)
不正确地工作DQL(返回3208):
SELECT COUNT(u)
FROM RAZUserBundle:User u
LEFT JOIN u.groups dug WITH dug.id = 70
WHERE dug IS NULL
Run Code Online (Sandbox Code Playgroud)
问题是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
Run Code Online (Sandbox Code Playgroud)
有什么建议?
我不认为你的DQL是对的.你可以发布吗?但与此同时,这应该有效.
$em = $this->getDoctrine()->getManager();
$qb = $em->createQueryBuilder();
$result = $qb->select('COUNT(u)')
->from('UserBundle:User' , 'u')
->leftJoin('u.UserGroup','g')
->where('g.GroupId = :id')
->andWhere('g.UserId = :null')
->setParameter('id', 70)
->setParameter('null', null)
->getQuery()
->getOneOrNullResult();
Run Code Online (Sandbox Code Playgroud)
用这种方式编写DQL也更容易阅读;)
我在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
)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
18024 次 |
最近记录: |