如何检查实体是否是与 Doctrine QueryBuilder 的多对多关系之一
How to check if Entity is one of a ManyToMany relationship with Doctrine QueryBuilder
我有个人资料和用户实体。配置文件可以通过以下三种方式之一与用户关联:
- 主要用户
- 编辑用户
- 查看用户数
这是一个基本的权限结构。我需要做的是按用户获取 all 配置文件,无论授予的权限如何。我想如果我使用的是 Doctrine 2.5.* 我会没事的,因为 QueryBuilder 添加了 'member of' 比较,但我使用的是 Symfony 2.7.* 不幸的是 Doctrine 只能达到 2.4.*(某种如果你使用低于 Symfony 3 的版本跳转到 Doctrine 2.5,这似乎是稳定性问题。
虽然我不确定如何复制该功能。
<?php
namespace AppBundle\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\EntityRepository;
class ProfileRepository extends EntityRepository
{
/**
* @param User $user
*
* @return ArrayCollection
*/
public function getAllByUser(User $user, $status = NULL)
{
$qb = $this->createQueryBuilder('p');
$e = $qb->expr();
$qb->where($e->eq('p.primary_user', ':user'));
// Some kind of comparison? a join?;
$qb->setParameter('user', $user);
$qb->setParameter('userId', $user->getId());
if ($status) {
$qb->andWhere($e->eq('p.status', ':status'));
$qb->setParameter('status', $status);
}
return $qb->getQuery()->getResult();
}
}
解决方案...
使用 DQL:
SELECT p
FROM Profile p
WHERE p.primaryUser = :user
OR :user MEMBER OF p.editUsers
OR :user MEMBER OF p.viewUsers
使用查询生成器:
$qb = $this->createQueryBuilder("p");
$qb
->where("p.primaryUser = :user")
->orWhere(":user MEMBER OF p.editUsers")
->orWhere(":user MEMBER OF p.viewUsers")
->setParameter("user", $user)
;
我有个人资料和用户实体。配置文件可以通过以下三种方式之一与用户关联:
- 主要用户
- 编辑用户
- 查看用户数
这是一个基本的权限结构。我需要做的是按用户获取 all 配置文件,无论授予的权限如何。我想如果我使用的是 Doctrine 2.5.* 我会没事的,因为 QueryBuilder 添加了 'member of' 比较,但我使用的是 Symfony 2.7.* 不幸的是 Doctrine 只能达到 2.4.*(某种如果你使用低于 Symfony 3 的版本跳转到 Doctrine 2.5,这似乎是稳定性问题。
虽然我不确定如何复制该功能。
<?php
namespace AppBundle\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\EntityRepository;
class ProfileRepository extends EntityRepository
{
/**
* @param User $user
*
* @return ArrayCollection
*/
public function getAllByUser(User $user, $status = NULL)
{
$qb = $this->createQueryBuilder('p');
$e = $qb->expr();
$qb->where($e->eq('p.primary_user', ':user'));
// Some kind of comparison? a join?;
$qb->setParameter('user', $user);
$qb->setParameter('userId', $user->getId());
if ($status) {
$qb->andWhere($e->eq('p.status', ':status'));
$qb->setParameter('status', $status);
}
return $qb->getQuery()->getResult();
}
}
解决方案...
使用 DQL:
SELECT p
FROM Profile p
WHERE p.primaryUser = :user
OR :user MEMBER OF p.editUsers
OR :user MEMBER OF p.viewUsers
使用查询生成器:
$qb = $this->createQueryBuilder("p");
$qb
->where("p.primaryUser = :user")
->orWhere(":user MEMBER OF p.editUsers")
->orWhere(":user MEMBER OF p.viewUsers")
->setParameter("user", $user)
;