Sonata Admin Bundle One-to-Many relationship not saving foreign ID

前端 未结 6 1323
粉色の甜心
粉色の甜心 2020-12-14 12:23

I have a problem with the SonataAdminBunle in combination with symfony 2.2. I have a Project entity and a ProjectImage entity and specified a One-to-Many relationship betwee

6条回答
  •  天涯浪人
    2020-12-14 13:03

    One way that I solved the was to manually set all inverse-side associations through a custom Sonata model manager.

    getEntityManager($object);
                $entityManager->persist($object);
                $entityManager->flush();
                $this->persistAssociations($object);
            } catch (\PDOException $e) {
                throw new ModelManagerException('', 0, $e);
            }
        }
    
        /**
         * {@inheritdoc}
         */
        public function update($object)
        {       
            try {
                $entityManager = $this->getEntityManager($object);
                $entityManager->persist($object);
                $entityManager->flush();
                $this->persistAssociations($object);
            } catch (\PDOException $e) {
                throw new ModelManagerException('', 0, $e);
            }
        }
    
        /**
         * Persist owning side associations
         */
        public function persistAssociations($object)
        {       
            $associations = $this
                ->getMetadata(get_class($object))
                ->getAssociationMappings();
    
            if ($associations) {
                $entityManager = $this->getEntityManager($object);
    
                foreach ($associations as $field => $mapping) {
                    if ($mapping['isOwningSide'] == false) {
                        if ($owningObjects = $object->{'get' . ucfirst($mapping['fieldName'])}()) {
                            foreach ($owningObjects as $owningObject) {
                                $owningObject->{'set' . ucfirst($mapping['mappedBy']) }($object);
                                $entityManager->persist($owningObject);
                            }
                            $entityManager->flush();
                        }
                    }
                }
            }
        }
    }
    

    Be sure to define this as a new service in your services.yml file:

    services:
        sample.model.manager:
            class: Sample\AdminBundle\Model\ModelManager
            arguments: [@doctrine]
    
    
        sample.admin.business:
            class: Sample\AdminBundle\Admin\BusinessAdmin
            tags:
                - { name: sonata.admin, manager_type: orm, group: "Venues", label: "Venue" }
            arguments: [~, Sample\AppBundle\Entity\Business, ~]
            calls:
                - [ setContainer, [@service_container]]
                - [ setModelManager, [@sample.model.manager]]
    

提交回复
热议问题