级联关联

  • 本文关键字:关联 级联 symfony
  • 更新时间 :
  • 英文 :


我正在尝试嵌入一个表单集合,但是我在持久化新创建的对象时遇到了麻烦。

一个Customer有许多Email。在我的控制器中

// CustomersController.php
$customer = new Customer();
$customer->setCreatedBy(0);
$blankEmail = new Email();
$customer->addEmail($blankEmail);
$form = $this->createForm(new CustomerType(), $customer);

我记得在我的Customer类中设置级联选项:

// Customer.php
...
/**
 * @ORMOneToMany(targetEntity="Email", mappedBy="customer", cascade={"persist"})
 */
protected $emails;

我的Email类也有所需的信息:

// Email.php
...
/**
 * @ORMManyToOne(targetEntity="Customer", inversedBy="emails", cascade={"persist"})
 * @ORMJoinColumn(name="customers_id", referencedColumnName="id")
*/
protected $customer;

由于某些原因,这不起作用:

if ($request->isMethod('POST')) {
    $form->bind($request);
    if ($form->isValid()) {
        $em = $this->getDoctrine()->getManager();
        $em->persist($customer);
        $em->flush();

它正确地添加了客户,但是当它试图添加Email时,它说没有设置customerId。所以,我尝试了这个,它工作:

if ($request->isMethod('POST')) {
    $form->bind($request);
    if ($form->isValid()) {
        $em = $this->getDoctrine()->getManager();
        foreach ($customer->getEmails() as $email) 
            $email->setCustomer($customer);
            $em->persist($email);
        }
        $em->persist($customer);
        $em->flush();

但是我真的希望能够一下子得到它,只是通过持久化$customer对象(我知道它可以)。

尝试更改客户类中默认的"addEmail"方法。

这个方法应该看起来像:

public function addEmail($email)
{
  $email->setCustomer($this);
  $this->emails[] = $email;
  return $this;
}

最新更新