【问题标题】:Best way to update entity one to many relationship in Symfony 2 / Doctrine 2在 Symfony 2 / Doctrine 2 中更新实体一对多关系的最佳方法
【发布时间】:2023-04-10 02:52:02
【问题描述】:

在 doctine 中更新实体一对多关系的最佳方法是什么? 例如:我有一个名为 booking 的实体,其中映射了一对多的 Guest 实体。

编辑预订时,可以通过添加或删除客人来更改客人的数量。 目前,我统计提交的客人数量,如果与当前客人数量不同,我删除预订客人并重新添加新的客人!

对我来说这似乎不对,我想知道其他人是如何处理这个问题的。

代码示例:

    if (count($collection)) {
        $numberGuests = count($this->getEntity()->getGuests());
        foreach ($collection as $guest) {
            if ($numberGuests != count($guests)) {
                // delete guest if the number has changed
                $this->getGuestManager()->delete($guest);
            } else {
                // update entity
                $guest->setArrayData(Tools::getData($i, $guests));
            }
        }
    }

【问题讨论】:

    标签: php symfony doctrine-orm


    【解决方案1】:

    我认为没有最好的方法,但是您现在的方法不正确。为什么用户修改了客人,但人数还是一样(他从列表中删除了一位客人,但添加了一位新客人)?

    无论如何,我认为每次有人编辑时“重置”关系并不是一个糟糕的方法(尽管可能不是最有效的),您只需要从拥有方(客人)设置预订即可。 (在多对一关系中,“多”方必须是拥有方)

    我会在控制器中这样做:

        if ($editForm->isValid()) {
    
            //find all guests entities that has this booking related
            $oldguests=$em->getRepository('YourBundle:Guest')->findby(array("booking"=>$entity));
            //well you will need to custom a little bit better this "findby"
    
            foreach($oldguest as $guest){
                 //remove the booking for that guest. So that guest won't have any booking linked  
                 $guest->removeBooking();
                 $em->persist($guest);  
            }
            //now we make the link with guest and booking 
            //$form->submit($request) should have set the current entity with the current guests the user selected
            foreach($entity->getGuests() as $currentguest){
                 $currentguest->setBooking($entity);
                 $em->persist($guest);
            }
    
            $em->persist($entity);
            $em->flush();
    
        }
    

    在来宾实体中,我将添加函数 removeUser

     //guest.php
     public function removeBooking(){
           $this->booking=NULL;
     } 
    

    如果您在 GuestRepository.php 中创建一个执行控制器正在执行的操作的函数,然后在控制器中调用该函数,可能会更优雅。

    你真的需要照顾好关系的拥有者。如果您允许通过拥有方进行版本,即使用预订更新客人,则默认代码应用程序/控制台为您提供根本不需要任何类型的自定义:两个实体都将正确更新。

    为了简单起见,我们可以说:让用户更新关系的拥有方 => 一切都是自动的。让用户更新关系的反面 => 需要手动定制。 (这对于多对多关系也是一样的)。

    希望这会有所帮助。

    【讨论】:

    • 感谢您的评论。你说的有道理!关于您的问题:为什么如果用户修改了客人但人数仍然相同(他从列表中删除了一位客人但添加了一位新客人)? - 不,它不会删除并添加一个新的 - 它会更新。如果数量不同,它只会删除和添加新客人。
    • 使用您的代码 - 如果我们从客人那里删除预订 - 预订将是多余的。你会在重新链接后删除它吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 2013-12-04
    • 1970-01-01
    相关资源
    最近更新 更多