【问题标题】:Doctrine querybuilder, include elements in ManytoMany relationshipDoctrine querybuilder,在多对多关系中包含元素
【发布时间】:2018-10-04 13:45:54
【问题描述】:

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

基本上,这个实体(称为Offer)可以有一些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?

【问题讨论】:

    标签: symfony doctrine symfony4 doctrine-query


    【解决方案1】:

    未经测试,我认为您看起来像这样:

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

    基本问题是您没有加入优惠表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-18
      • 2014-03-26
      • 1970-01-01
      相关资源
      最近更新 更多