每当我保存一个新的子行时,我是否必须检查父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,还是需要手动检查?
答案 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;