如何删除关系ManyToMany

时间:2019-04-29 22:30:12

标签: php symfony

我是Symfony 4的初学者,在学习了一些教程之后,我正在研究一个提高自我的项目!

这是一个活动管理器,在后台向参与者注册。作为访客,我可以从引导表单的选择列表中注册一个或多个事件。 注册后,管理员可以通过选择特定事件并查看列表来访问其后台,并查看谁在该事件或该事件中进行了注册。

我的问题是,如果管理员决定从事件中删除参与者,则会在数据库中删除该参与者,因此会删除其已注册的所有事件。虽然我希望仅将其从相关事件中删除。

我认为我需要在事件的存储库文件中创建一个查询...

这是我认为有用的部分代码。

与ManyToMany有关系的我的Entity Participant.php:

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

实体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,
        ]);
    }

我必须创建一个custo请求,但是我阻止了它。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

如果您使用的是多对多关系,我建议 @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)生成Getter -Setter方法

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 :(得分:1)

我找到了不使用 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,
        ]);
}

我在Twig模板中通过AJAX调用在控制器中使用此功能!