Symfony2: сохранить отношение Onetoone => ошибка SQLSTATE [23000] Нарушение ограничения целостности - PullRequest
0 голосов
/ 15 декабря 2011

Я собираюсь быть сумасшедшим с сохранением controller action между двумя entities.

У меня есть 2 сущности:

Первый расширенный FOSUser

class User extends BaseUser
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;    

    /**
     * @var Namespace\LoginBundle\Entity\T $t
     *
     * @ORM\OneToOne(targetEntity="Namespace\LoginBundle\Entity\T", cascade={"persist"})
     */
    private $t;
}

второй:

class T 
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;   

    /**
     * @ORM\OneToOne(targetEntity="Namespace\LoginBundle\Entity\User", cascade={"persist"})
     */
    private $user;
}

, когда я вхожу в свое приложение и User все еще сохраняется, поэтому в моей базе данных есть строка с Tполе null.

В моем контроллере у меня есть этот метод:

public function createAction()
    {       
        $entity  = new T();        

        // user
        $user = $this->get('security.context')->getToken()->getUser();
        $entity->setUser($user);
        $user->setT($entity);

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

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

            $em->persist($entity);                
            $em->persist($entity->getUser());
            $em->persist($user->getT());

            $em->flush();                               

            return $this->redirect($this->generateUrl('t_show', array('id' => $entity->getId())));
        }

        return $this->render('NamespaceXXXXBundle:T:new.html.twig', array(
            'entity' => $entity,
            'form'   => $form->createView()                
        ));
    }

Я не понимаю, почему, у меня есть эта ошибка.

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`namespace`.`t`, CONSTRAINT `FK_58C6694C54EE02A4` FOREIGN KEY (`user_id`) REFERENCES `User` (`id`)) 

ПожалуйстаПомоги мне

Сэм

1 Ответ

0 голосов
/ 03 апреля 2012

У меня также была проблема с этим исключением

request.CRITICAL: PDOException: SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`mybundle`.`File`, CONSTRAINT `FK_70684D4DA76ED395` FOREIGN KEY (`user_id`) REFERENCES `JEP_File` (`id`)) (uncaught exception)

Проблема была в определении отображения.Я использовал плохое отображение в объекте File.Целевой объект в моем случае был mappihg к себе - файл.Вот почему внешние ключи не соответствуют таблице инверсии.

плохо

//...
class File{

   @ORM\ManyToOne(targetEntity="File",inversedBy="files")
//...

хорошо

//...
class File{
/**
 * @ORM\ManyToOne(targetEntity="User",inversedBy="files")
 * @ORM\JoinColumn(name="owner_id",referencedColumnName="id")
 */
protected $owner;
//...

Надеюсь, этопомогает.Попробуйте заглянуть в схему базы данных и не забудьте обновить ее

...