Доктрина отношения ManyToOne — автоматическое удаление при «наборе»

#php #symfony #orm #doctrine #backend

#php #симфония #орм #доктрина #серверная часть

Вопрос:

Я работаю с отношениями в Doctrine (используя Symfony 5). То, что у меня есть, — это эти 2 отношения:

  1. Пользователь
  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 сущности? Спасибо