我想构建一个查询,它为我尚未加入的登录用户带来了所有游戏。为此,我建立了这两个实体。他们被许多人联系在一起。
class Game
{
public function __construct()
{
$this->users = new ArrayCollection();
}
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
*
* @var Users[]
*
* @ORM\ManyToMany(
* targetEntity="Domain\Entity\User",
* inversedBy="user",
* fetch="EAGER"
* )
*/
private $users;
/**
* @return array
*/
public function getUsers() : array
{
return $this->users->getValues();
}
/**
* @param User $users
*/
public function setUser($users)
{
if(is_array($users)){
/** @var User $user */
foreach ($users as $user){
$this->users->add($user);
}
} else {
$this->users->add($users);
}
}
}
用户实体
class User implements AdvancedUserInterface
{
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
}
实体有更多属性,但我认为它们并不重要。 我也尝试了这些查询,但它不起作用。
/**
* @param User $user
* @return array
*/
public function fetchAllNonActivatedWhereYouNotJoin(User $user): array
{
$qb = $this->createQueryBuilder('g');
$qb->select('g')
->innerJoin('g.users', 'u')
->where('u.id != :user')
->andWhere('g.activate = 0')
->setParameter('user', $user->getId())
->getQuery()->getResult();
return $qb->getQuery()->getResult();
}
有谁知道解决方案?它的Symfony 3和PHP 7.1中的Doctrine
答案 0 :(得分:0)
执行此操作的一种方法是从游戏存储库开始加入2个实体,并使用加入条件登录用户并且条件用户为空:
$qb->leftJoin('g.users', 'u', Join::WITH, 'u.id = :user')
->andWhere('g.activate = 0')
->having('COUNT(u) = 0')
->groupby('g')
->setParameter('user', $user->getId())
->getQuery()->getResult();
这是因为学说水合作用,它在有限的连接查询上保持用户属性(在这种情况下,每个游戏将在用户集合中具有登录用户或不具有登录用户)。
如果您使用查询构建器进行连续查询,请小心这一点,因为实体管理器会保持对已经保持水合的关系的引用。 Reference of the issue