我是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请求,但是我阻止了它。
我该如何解决这个问题?
答案 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调用在控制器中使用此功能!