Как удалить часть данных в отношении ManyToMany - PullRequest
3 голосов
/ 30 апреля 2019

Я новичок в Symfony 4 и, пройдя некоторые уроки, я работаю над проектом по самосовершенствованию!

Это менеджер событий с регистрацией участников с бэк-офисом. Как посетитель, я могу зарегистрироваться для одного или нескольких событий из списка выбора формы начальной загрузки. После регистрации администратор может получить доступ к своему бэк-офису и узнать, кто зарегистрировался в том или ином событии, выбрав определенное событие и просмотрев список.

Моя проблема в том, что если администратор решает удалить участника из события, он удаляется из базы данных и, следовательно, всех событий, в которых он зарегистрирован. Пока я бы хотел, чтобы его удалили только из рассматриваемого события.

Я думаю, мне нужно создать запрос в файле репозитория моего события ...

Вот некоторые части кода, которые я считаю полезными.

My Entity Participant.php, у которого есть отношения ManyToMany:

/**
 * @ORM\ManyToMany(targetEntity="App\Entity\Event", inversedBy="participants")
 */
private $workshops;

Файл Entity Event.php:

/**
 * @ORM\ManyToMany(targetEntity="App\Entity\Participant", mappedBy="workshops")
 */
private $participants;

И в одном из моих контроллеров вот функция, которая удаляет участника из всех событий:

/**
 * @Route("/admin/delete_participant/{id}", name="delete_participant")
*/
    public function deleteParticipant(EntityManagerInterface $manager, Participant $participant) {

        $manager->remove($participant);
        $manager->flush();

        $this->addFlash('danger', "Participant deleted");

        return $this->redirectToRoute("admin_page", [
            'participant' => $participant,
        ]);
    }

Я должен создать запрос на учетную запись, но блокирую его.

Как мне решить эту проблему?

Ответы [ 2 ]

3 голосов
/ 30 апреля 2019

Я бы предложил @ JoinTable , если вы используете ОТ МНОГО К МНОМУ Отношения .

Здесь я даю вам шаги, которые могут вам помочь:

1) в Participant.php

/**
 * @ORM\ManyToMany(targetEntity="App\Entity\Event", inversedBy="participants")
* @ORM\JoinTable(name="participants_event",
     *         joinColumns = {@ORM\JoinColumn(name="participants_id", referencedColumnName="id", onDelete="CASCADE")},
     *         inverseJoinColumns={@ORM\JoinColumn(name="workshops_id", referencedColumnName="id")}
     *      )
 */
private $participantsEvent;

2) в Event.php

/**
 * @ORM\ManyToMany(targetEntity="App\Entity\Participant", mappedBy="participantsEvent")
 */
private $participants;

3) Генерировать метод получения-геттера

php bin/console make:entity --regenerate

4) Обновление схемы доктрины

php bin/console doctrine:schema:update --force

5) Удалить участника

//$event  Object Of Event
//$participants Object of Participant
$event->removeParticipants($participants);
1 голос
/ 09 мая 2019

Я нашел решение без использования JoinTable

/**
 * @Route("admin/{id}/edit_event/", name="delete_participant")
 */
 public function deleteParticipant(int $id, Request $request): JsonResponse
    {
        $em = $this->getDoctrine()->getManager();

        $event = $em->getRepository(Event::class)->find($id);

        $participant = $em->getRepository(Participant::class)->find($request->request->get('participant_id'));

        $event->removeParticipant($participant);

        $em->persist($event);
        $em->flush();

        return new JsonResponse([
            'event' => $event,
        ]);
}

Я использую эту функцию в моем контроллере с вызовом AJAX в моем шаблоне Twig!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...