#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: Мне нужно перенести фактическую функциональность (реализованную в другой структуре): при редактировании пользователя можно назначать ему разные роли; при редактировании группы пользователей назначайте ее разным ролям (также: назначайте пользователей в эту группу); при редактировании роли назначайте ей пользователей и / или группы пользователей.