Symfony OneToMany关系检查是否存在main(One)实体,如果插入新的子(Many)实体

时间:2017-09-01 09:17:03

标签: php symfony doctrine-orm

每当我保存一个新的子行时,我是否必须检查父ID是否实际存在?我原以为symfony / doctrine会自动检查,并且会因为OneToMany定义而引发错误b

示例:

主要实体(“一个”):

class Order
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @ORM\OneToMany(targetEntity="OrderPayment", mappedBy="orderId")
     */
    private $orderPayments;



    public function __construct()
    {
        $this->orderPayments = new ArrayCollection();
    }

}

儿童实体(“许多”):

class OrderPayment
{
    /**
     * @ORM\ManyToOne(targetEntity="Order", inversedBy="orderPayments")
     * @ORM\JoinColumn(name="order_id", referencedColumnName="id")
     */
    private $orderId;

    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

}

每当我向数据库插入新的OrderPayment行时,Symfony不应该检查数据库中是否存在$ orderId,还是需要手动检查?

2 个答案:

答案 0 :(得分:2)

最好将$orderId重命名为$order。 Doctrine将关系视为Entity对象,而不是整数。是的,如果您保存OrderPayment并且Order不存在,则Doctrine会抛出错误!

当您重命名属性,重新生成实体并更新数据库方案时,请向订单付款添加订单,如下所示:

$order = // get order from db
$orderPayment = new OrderPayment();
$orderPayment->setOrder($order);
$em->persist($orderPayment);
$em->flush();

答案 1 :(得分:1)

您应该将订单实体本身传递给OrderPayment构造函数,因为没有订单,OrderPayment不能存在。

//OrderPayment
public function __construct(Order $order)
{
    $this->order = $order
    $this-createdAt = \DateTime::now();
}

//Controller or Service
$order = $orderRepository->getOrderBySomeField($field);
if ( ! $order){
    throw new HttpNotFoundException();
}
$orderPayment = new OrderPayment ($order);
$em->persist($orderPayment);
$em->flush;