"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
如果您正在使用查询构建器进行连续查询,请注意这一点,因为实体管理器会保留对已经水合的关系的引用。
我想构建一个查询,为我提供他尚未加入的已登录用户的所有游戏。为此,我构建了这两个实体。它们是多对多连接的。
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
如果您正在使用查询构建器进行连续查询,请注意这一点,因为实体管理器会保留对已经水合的关系的引用。