我有一个像这样的Symfony表单类型类:
$builder->add('blockedUsers', EntityType::class, [
'class' => User::class,
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('u')
->where('u.isActive=1')
// error:
->orWhere('u.id IN (SELECT user_id FROM offer_blockedusers WHERE offer_id=:offer_id)')
->setParameter(':offer_id', $options['offer_id'])
->orderBy('u.username', 'ASC');
},
'label' => 'Blocked users',
'required' => false,
'multiple' => true,
'choice_label' => 'username'
])
基本上,该实体(称为“优惠”)可以具有一些blockedUsers:
/**
* @ORM\ManyToMany(targetEntity="User")
* @ORM\JoinTable(
* name="offer_blockedusers",
* joinColumns={
* @ORM\JoinColumn(name="offer_id", referencedColumnName="id", onDelete="CASCADE")
* },
* inverseJoinColumns={
* @ORM\JoinColumn(name="user_id", referencedColumnName="id", onDelete="CASCADE")
* }
* )
*/
private $blockedUsers;
管理员可以允许/阻止某些用户的报价:
在此下拉菜单中,我只想显示活动用户,加,该用户已被该优惠屏蔽。 (因为如果长时间不登录,用户可能会变得不活跃,但必须继续对其进行屏蔽)
我的尝试失败了,因为我得到了
未定义“ offer_blockedusers”类。
由于它不是实体,而是联接表。
我可以使用DQL进行此操作还是应该切换到本机SQL?
答案 0 :(得分:0)
未经测试,我认为您的外观是这样的:
return $this->createQueryBuilder('u')
->leftJoin('App\Entity\Offer', 'of', 'WITH', 'of.id = :offer_id')
->where('u.isActive = 1')
->orWhere('of.id IS NOT NULL')
->setParameter(':offer_id', $options['offer_id'])
->orderBy('u.username', 'ASC');
基本问题是您没有加入要约表。