繁体   English   中英

如何删除ManyToMany关系中的一部分数据

[英]How to delete a part of data in a relation ManyToMany

我是Symfony 4的初学者,在完成了一些教程之后,我正在开展一个改善自己的项目!

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

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

我想我需要在我的活动的存储库文件中创建一个查询...

以下是我认为有用的代码的一些部分。

我的实体Participant.php有一段关系ManyToMany:

/**
 * @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请求,但我阻止它。

我该如何解决这个问题?

如果你使用MANY TO MANY Relationship,我会建议@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)Doctrine Schema Update

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

5)删除参与者

//$event  Object Of Event
//$participants Object of Participant
$event->removeParticipants($participants);

我找到了一个没有使用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调用!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM