【发布时间】:2021-03-17 16:29:19
【问题描述】:
假设我们有两个处于 OneToMany 关系的实体,例如:
User 实体与 Rewards 实体具有 OneToMany 关系,并且每个 Reward 可能有不同的type:例如'forOnboarding'、'forReferring'、'forBeingReerred'。
User {
/**
* @var Reward[]
*
* @ORM\OneToMany(targetEntity="Reward", mappedBy="rewardee"}
*/
private $rewards;
}
Reward {
/*
* @var User
*
* @ORM\ManyToOne(targetEntity="User", inversedBy="rewards")
* @ORM\JoinColumn(nullable=false)
*/
private $rewardee;
/** @var string */
private $type;
}
很容易找到与确切奖励类型相关的用户,例如:
public function findUsersWithRewardType(string $rewardType): ?array
{
$qb = $this->createQueryBuilder('u')
->leftJoin('u.rewards', 'r')
->where('r.type = :reward_type')
->setParameter('reward_type', $rewardType);
$query = $qb->getQuery();
$result = $query->getResult();
return $result;
}
现在我想构建一个查询来查找所有缺乏特定类型奖励的用户。这有点棘手,所以任何帮助将不胜感激!
由于 OneToMany 关系的性质,我不能简单地将条件从等于更改为不等于,也不能使用关系为空的条件(如下面的示例所示),因为它不会返回有效结果因为用户可能与其他类型的奖励有关系。
public function findUsersWithoutRewardType(string $rewardType): ?array
{
$qb = $this->createQueryBuilder('u');
$qb
->leftJoin('u.rewards', 'r')
->where('r.type = :reward_type')
->setParameter('reward_type', $rewardType)
->andWhere('r is NULL');
$query = $qb->getQuery();
$result = $query->getResult();
return $result;
}
PS:即使所有用户都缺乏与奖励的关系,上述方法也不起作用。可能是因为属性 User->rewards 实际上是 ArrayCollection 并且从未设置为 null。
谢谢!
【问题讨论】:
标签: symfony doctrine-orm doctrine symfony4