Построитель запросов Doctrine, включите элементы в отношения ManytoMany - PullRequest
0 голосов
/ 04 октября 2018

У меня есть класс типа формы 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'
])

По сути, эта сущность (называемая Предложение) может иметь несколько заблокированных пользователей:

/**
 * @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 голосов
/ 04 октября 2018

Не протестировав, я думаю, что вы выглядите примерно так:

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

Основная проблема в том, что вы не присоединяетесь к таблице предложений.

...