Форма Symfony с условными m:n связанными объектами

#forms #symfony #doctrine

Вопрос:

у меня проблема с пониманием того, как я могу управлять следующей моделью данных с помощью форм symfony.

У меня есть следующие 3 сущности:

  • Пользователь
  • Группа пользователей
  • Роль

Роль может быть назначена пользователю или группе пользователей. Поэтому у меня есть a role_target — таблица, в которой есть определенное target_type поле:

 table role_target:

id
role_id
target_id.          // user_id or group_id
target_type         // 'user' or 'group'
create_user_id
create_ts
 

Как я могу создать форму для управления этими условными отношениями? После долгого чтения / поиска лучше всего было бы создать отношение m:n с помощью аннотации и создать геттер с критерием:

 class User {
...

  /**
   * @ORMManyToMany(...)
   */
  private $groups;

  public function getGroups() {
    $criteria = Criteria::create();
    // how can i access the m:n relation table?
    $criteria->where(Criteria::expr()->eq('role_targets.target_type', 'user'));
    return $this->groups->matching($criteria);
  }

}
 

Но я не мог этого выяснить:

  • Есть ли способ получить доступ к таблице m:n в критериях, как показано выше?
  • Могу ли я использовать это для создания EntityType поля формы (не думаю, что это так) или есть другой способ сделать это с помощью форм Symfony?

Я перечитал документацию по symfony/доктрине и поискал в Интернете, но не смог найти ответа.

Спасибо.

Комментарии:

1. Чтобы использовать Criteria его, вам нужно применить его к своей коллекции. В вашем случае, внутри сущности пользователя, ваша коллекция такова $this->groups , что вам просто нужно return $this->groups->matching($criteria); в вашем getGroups() методе. Но я думаю, что это не поможет…

2. Да, я бы согласился: я думаю, что это не помогает, потому что я не вижу, как Symfony должна знать, как сохранить отношение (когда форма будет отправлена).

3. Я предполагаю, что вам нужна только одна форма symfony для сущности пользователя, в которой вы можете выбрать из списка (выпадающего списка) все возможные роли и выбрать одну цель для выбранной роли(ролей), верно ?

4. Если у вас есть истинная ассоциация ManyToMany для групп пользователей::$, role_targets.target_type это не должно иметь значения, поскольку идентификатор пользователя идентификатор группы является вашей ассоциацией, вам потребуется сопоставление дискриминатора для разделения двух шаблонов ролей и групп пользователей в ORM. Тем не менее, вы, скорее всего, захотите использовать форму query_builder в своей форме, поскольку именно это управляет полученными доступными опциями для Формы. Нам нужно было бы увидеть код вашей формы, чтобы продолжить разработку, но, похоже, вы можете захотеть CollectionType

5. @V-Light: Мне нужно перенести фактическую функциональность (реализованную в другой структуре): при редактировании пользователя можно назначать ему разные роли; при редактировании группы пользователей назначайте ее разным ролям (также: назначайте пользователей в эту группу); при редактировании роли назначайте ей пользователей и / или группы пользователей.