教义的querybuilder,包括多对多关系中的元素

时间:2018-10-04 13:45:55

标签: symfony doctrine symfony4 doctrine-query

我有一个像这样的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;

管理员可以允许/阻止某些用户的报价:

https://i.stack.imgur.com/7O5nk.png

在此下拉菜单中,我只想显示活动用户,,该用户已被该优惠屏蔽。 (因为如果长时间不登录,用户可能会变得不活跃,但必须继续对其进行屏蔽)

我的尝试失败了,因为我得到了

  

未定义“ offer_blockedusers”类。

由于它不是实体,而是联接表。

我可以使用DQL进行此操作还是应该切换到本机SQL?

1 个答案:

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

基本问题是您没有加入要约表。