В Symfony существует несколько способов хранения множественных свойств. Один из наиболее популярных способов - использование связи "ManyToMany" между двумя сущностями.
Для начала, необходимо создать две сущности, которые будут иметь множественное свойство. Например, допустим у нас есть сущности "User" и "Role", и каждый пользователь может иметь несколько ролей, а каждая роль может быть присвоена нескольким пользователям.
Для создания связи "ManyToMany", необходимо добавить соответствующие аннотации над свойствами сущностей. Например, в сущности "User" мы можем добавить свойство "roles", которое будет являться коллекцией объектов класса "Role":
use DoctrineCommonCollectionsArrayCollection; use DoctrineCommonCollectionsCollection; class User { /** * @var Collection|Role[] * * @ORMManyToMany(targetEntity="AppEntityRole", inversedBy="users") * @ORMJoinTable(name="users_roles") */ private $roles; public function __construct() { $this->roles = new ArrayCollection(); } // ... }
Здесь мы использовали аннотации ManyToMany
, targetEntity
указывает на целевую сущность, с которой устанавливается связь, и inversedBy
указывает на свойство обратной связи в целевой сущности.
Далее, в сущности "Role" добавим свойство "users", которое будет представлять коллекцию пользователей, связанных с данной ролью:
use DoctrineCommonCollectionsArrayCollection; use DoctrineCommonCollectionsCollection; class Role { /** * @var Collection|User[] * * @ORMManyToMany(targetEntity="AppEntityUser", mappedBy="roles") */ private $users; public function __construct() { $this->users = new ArrayCollection(); } }
Здесь мы использовали аннотацию mappedBy
, которая указывает на свойство, по которому устанавливается связь.
При работе с такой связью, вы можете добавлять и удалять роли для каждого пользователя путем манипуляции с коллекцией $roles
в сущности "User" или коллекцией $users
в сущности "Role". Вы также можете использовать методы addRole()
и removeRole()
для удобного управления этими коллекциями.
Например, чтобы присвоить роль пользователю, вы можете использовать следующий код:
$user = new User(); $role = new Role(); $user->addRole($role);
А для удаления роли у пользователя:
$user->removeRole($role);
Когда вы сохраняете объекты с такой связью в базе данных, Symfony и Doctrine обрабатывают создание и обновление промежуточной таблицы автоматически.
Множественные свойства также можно хранить в виде массива или JSON строки в одном поле базы данных. Этот подход удобен, если вам не требуется полноценная связь между сущностями или если количество связанных объектов мало. Однако, в большинстве случаев, использование связи "ManyToMany" сущностей является более гибким и расширяемым решением.