首先:我知道这个标题没有帮助,但这是我能想到的最好的标题。
所以我在 Symfony
中有两个实体,一个称为 Team
,另一个称为 Slot
Slot
实体有名称、开始日期和结束日期以及所有这些内容。除此之外,他还有一个名为 amount 的 int 字段,您可以在其中设置能够参与该时段/回合的团队数量。它还具有与 Team
实体的 OneToMany
连接(双向)。
Team
实体存储团队名称和所有内容,并具有与 Slot
实体的 ManyToOne
连接(真是令人惊讶;) )
但是,我希望能够通过简单地在下拉列表中选择一个团队来将其分配到某个时间段。所以在表单中我添加了这样的内容:
->add('slot', 'entity', array(
'label' => 'Zeitslot',
'class' => 'FooChallengeBundle:Slot',
'property' => 'output',
'query_builder' => function(\Foo\ChallengeBundle\Entity\SlotRepository $er) {
return $er->createQueryBuilder('u')
->where('u.bookable = 1')
->andWhere('u.hide = 0');
}
))
这项工作就像一个魅力!我剩下的唯一问题是确定该插槽是否已被占用。举例来说,我们将槽位数量设置为 3。我们进一步假设已经有 3 个团队分配到该槽位。在这种情况下,我不想在下拉列表中显示该选项。那么我需要在 QueryBuilder 中做什么来测量它呢?我尝试添加 having()
,但不幸的是没有完成这项工作。
哦,奖励内容:
- 如果有 4 个团队分配到一个位置,假设只有两个团队 地方,它不应该接受任何进一步的(比如达到全额时)。如果有人更改了管理员中的金额,则可能会发生这种情况。
- 当然,如果您的团队(当前编辑的团队)是最后一个可能的团队,则该位置必须仍然可选。 (就像数量是 7,已经分配了 7 个团队,如果您的团队是其中之一,您仍然需要能够选择该条目)。
最佳答案
拥有会像这样工作得很好:
$qb->select('s')
->from('FooChallengeBundle:Slot', 's')
->join('s.teams', 't')
->groupBy('s')
->having('count(t) < s.amount')
->getQuery()
->getResult();
关于php - 用于检查空闲位置的 Symfony 实体查询构建器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30857430/