#php #symfony #orm #doctrine #backend
#php #симфония #орм #доктрина #серверная часть
Вопрос:
Я работаю с отношениями в Doctrine (используя Symfony 5). То, что у меня есть, — это эти 2 отношения:
- Пользователь
- Доступность
Пользователь имеет идентификатор и имеет множество возможностей доступа.
Итак, пользователь объекта имеет
/**
* @ORMOneToMany(targetEntity="UserAvailability", mappedBy="user")
*/
private $availability;
и обратное при доступности объекта.
Доступность — это связь с:
id, user_id, имя_дня, start_time и end_time, это просто.
Чего я уже достиг с помощью ManyToMany и хочу достичь и в этом случае, так это:
Мне нужно получить от клиента весь набор возможностей для пользователя и использовать его для обновления возможностей моего пользователя, поэтому я определил метод setAvailability, который получает коллекцию объектов доступности и просто выполняет
$this->availabilities = $availabilities.
Это работает, когда я добавляю новые возможности, но те, которые находятся в базе данных, а не в коллекции, не удаляются при сохранении объекта.
Тот же метод безупречно работает с отношениями ManyToMany.
Чего мне не хватает?
*** ОБНОВИТЬ **
public function setAvailability($availability): self
{
$this->availability = $availability;
return $this;
}
этот же код работает при удалении отношений в ManyToMany relationship, но не в ManyToOne, атрибут «доступность» установлен правильно, но при использовании persist / flush удаленная доступность не удаляется в БД.
Спасибо
Комментарии:
1. можете ли вы поделиться методами?
2. User.availability НЕ является стороной-владельцем, следовательно, изменения в нем применяются только частично. Внимательно посмотрите на doctrine-project.org/projects/doctrine-orm/en/2.7/reference /… (в частности, удаление сирот). не уверен прямо сейчас, нужно ли вам активно отключать пользователя от объектов доступности (User)
Ответ №1:
Попробуйте установить атрибуты, как в примере из документации doctrine ниже :
<?php
use DoctrineCommonCollectionsArrayCollection;
/** @Entity */
class User
{
// ...
/**
* One user has many availabilities. This is the inverse side.
* @OneToMany(targetEntity="Availability", mappedBy="user")
*/
private $availabilities;
// ...
public function __construct() {
$this->availabilities = new ArrayCollection();
}
}
/** @Entity */
class Availability
{
// ...
/**
* Many availabilities have one user. This is the owning side.
* @ManyToOne(targetEntity="User", inversedBy="availabilities")
* @JoinColumn(name="user_id", referencedColumnName="id")
*/
private $user;
// ...
}
атрибут mappedBy
и inversedBy
необходимы для отношений
Комментарии:
1. Я забыл упомянуть, что mappedBy и inversedBy установлены правильно. Спасибо
2. Можете ли вы полностью разделить эти 2 сущности? Спасибо