Symfony2 - Doctrine Save Entites с отношением один к одному - PullRequest
0 голосов
/ 01 декабря 2011

Я хочу сохранить созданную мной форму, но у меня ошибка.

У меня есть 3 объекта:

class T {
    /**
     * @ORM\OneToOne(targetEntity="MyNameSpace\ProfileBundle\Entity\Person", cascade={"persist"})

     */
    private $information;
}

class Person {
    /**
     * @ORM\OneToOne(targetEntity="MyNameSpace\MediaBundle\Entity\Document", cascade={"persist"}))
     */
    private $photo_profile;
}

class Document
{
    private $file;
}

Когда я сохраняю свой класс "T" с этим кодом:

public function createAction()
{
        $entity     = new T();                        
        $request = $this->getRequest();
        $form    = $this->createForm(new TType(), $entity);        
        $form->bindRequest($request);

        if ($form->isValid()) 
        {
            $em = $this->getDoctrine()->getEntityManager();
            $em->persist($entity);            
            $em->flush();
        }
} 

У меня есть эта ошибка:

SQLSTATE [23000]: Нарушение ограничения целостности: 1452 Невозможно добавить или обновить дочернюю строку: сбой ограничения внешнего ключа (namespace. person, CONSTRAINT FK_3370D440809EFCB0 FOREIGN KEY (photo_profile_id) ССЫЛКИ Document (id))

Любая помощь будет крутой

Спасибо за все


Вот код, который я имею:

/**
 * Creates a new Tutor entity.
 */
public function createAction()
{       
    $entity  = new T();        
    $person = new Person();        

    $document = new Document();
    $person->setPhoto($document);

    $entity->setInformation($person);

    $request = $this->getRequest();
    $form    = $this->createForm(new TType(), $entity);        
    $form->bindRequest($request);

    if ($form->isValid()) {
        $em = $this->getDoctrine()->getEntityManager();

        $em->persist($entity->getInformation()->getPhoto());
        $em->persist($entity->getInformation());           
        $em->flush();

        $em->persist($entity);
        $em->flush();                       

        return $this->redirect($this->generateUrl('Index'));
    }

и у меня есть эта ошибка:

SQLSTATE [23000]: нарушение ограничения целостности: 1452 Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется (db. T, ОГРАНИЧЕНИЕ FK_58C6694C2EF03101 ИНОСТРАННЫЙ КЛЮЧ (information_id) ССЫЛКИ Person (id))

Любая помощь, пожалуйста, будет круто

Спасибо

Ответы [ 3 ]

2 голосов
/ 16 августа 2012

Я тоже столкнулся с этой проблемой, и каскадирование не помогло, поэтому я использовал вместо этого отношения oneToMany, manyToOne.

Альтернативное решение, которое у меня было, состояло в том, чтобы не применять ограничения внешнего ключа в сгенерированном SQL, но это лишило бы мою способность --force (и вынудило бы меня написать собственный скрипт, игнорирующий ограничения FK), поэтому решение oneToMany более элегантно для меня.

0 голосов
/ 13 марта 2013

У меня была такая же проблема с отношением ManyToOne ;. Я просто должен был:

  1. сохранить владельца объекта
  2. флеш
  3. создать обратное и связать его
  4. сохраниться и снова промыть Тогда все прошло нормально!

Ну, я не могу этого объяснить, но я просто делюсь своим опытом, и, возможно, он будет полезен!

0 голосов
/ 01 декабря 2011

Вы пытаетесь сохранить Person, но вы не указали отношение к Документу (которое должно называться photo_profile) как обнуляемое, поэтому эта ошибка.

...