Сохранение объектов отношения onetoone

Я получаю следующую ошибку, когда пытаюсь сохранить свой объект заказа:

Нарушение ограничения целостности: 1048 Столбец 'package_id' не может быть нулевым.

Упрощенные сущности:

    class Order
    {

        /**
         * @ORM\Id
         * @ORM\Column(type="integer")
         * @ORM\GeneratedValue(strategy="IDENTITY")
         */
        protected $id;        

        /** 
         * @ORM\OneToOne(targetEntity="DeliveryPackage",inversedBy="order", cascade={"persist"})  
         * @ORM\JoinColumn  (name="package_id", referencedColumnName="id")   
         */
        protected $package; 

        /**
         * @ORM\ManyToOne(targetEntity="User",cascade={"persist"} )
         * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
         */
        protected $user;

    public function setId($id)
    {
        $this->id = $id;
    }

    public function getId()
    {
        return $this->id;
    }

    public function setPackage($package)
    {
        $this->package = $package;
    }

    public function getPackage()
    {
        return $this->package;
    }
}

class DeliveryPackage
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    protected $id;

    /** 
     * @ORM\OneToOne(targetEntity="Order",mappedBy="deliverypackage",cascade={"persist"})
     * @ORM\JoinColumn  (name="order_id", referencedColumnName="id")       
     */
    protected $order;    

    public function setId( $id )
    {
        $this->id = $id;
    }

    public function getId()
    {
        return $this->id;
    }

    public function setOrder( $order )
    {
        $this->order = $order;
    }

    public function getOrder()
    {
        return $this->order;
    }   

}

Суть в том, что обе сущности новые. Так что у них еще нет id. Есть ли вариант, чтобы сохранить их обоих с помощью

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

?


person fperet    schedule 07.06.2012    source источник


Ответы (2)


Вам нужно сохранить их, как только отношения уже установлены. Попробуйте изменить Order::setPackage на следующее:

public function setPackage($package)
{
    $this->package = $package;
    $package->setOrder($this);
}

Затем установите отношение ПЕРЕД сохранением:

$order = new Order();
$package = new Package();
$order->setPackage($package);
$em->persist($order);
$em->flush();

Я думаю, вы найдете, что это работает нормально. Я столкнулся именно с этой проблемой, когда впервые играл с Doctrine 2.

person Lee Davis    schedule 07.06.2012

Решение частично основано на предыдущем ответе, но этого недостаточно для полного решения проблемы.

Итак, нужно было сделать 2 действия. Сначала - добавить

$package->setOrder($this);

к моему сеттеру.

Во-вторых, вы не можете определить оба столбца ссылок как строго не NULL. Итак, я переопределил столбец package_id как null, и это сработало.

person fperet    schedule 08.06.2012