" NOT EXISTS"查询多对多关系Doctrine Symfony3

时间:2018-02-20 19:24:34

标签: php doctrine-orm php-7 symfony-3.3

我想构建一个查询,它为我尚未加入的登录用户带来了所有游戏。为此,我建立了这两个实体。他们被许多人联系在一起。

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

1 个答案:

答案 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();

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

还有other ways to achieve this

如果您使用查询构建器进行连续查询,请小心这一点,因为实体管理器会保持对已经保持水合的关系的引用。 Reference of the issue