"NOT EXISTS" 使用多对多关系原则查询 Symfony3

"NOT EXISTS" Query with Many to Many Relation Doctrine Symfony3

我想构建一个查询,为我提供他尚未加入的已登录用户的所有游戏。为此,我构建了这两个实体。它们是多对多连接的。

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();
}

有人知道解决办法吗? PHP 7.1

中的 Symfony 3 和 Doctrine

一种方法是游戏存储库开始,左加入2个实体加入条件到已登录用户,条件是users为空:

$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();

这是有效的,因为学说水合作用,它在有限的连接查询中水合用户 属性(在这种情况下,每个游戏都会有登录用户或不在用户集合中)。

还有other ways to achieve this

如果您正在使用查询构建器进行连续查询,请注意这一点,因为实体管理器会保留对已经水合的关系的引用。