2013-03-19 3 views
0

Я пытаюсь установить embed a collection of forms, но у меня возникли проблемы с сохранением вновь созданных объектов.Каскадирование ассоциации

A Customer имеет много Email s. В мой контроллер,

// CustomersController.php 
$customer = new Customer(); 
$customer->setCreatedBy(0); 

$blankEmail = new Email(); 
$customer->addEmail($blankEmail); 

$form = $this->createForm(new CustomerType(), $customer); 

Я помню, чтобы установить возможность каскадного в моем Customer классе:

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

Мой Email класс также имеет необходимую информацию:

// Email.php 
... 
/** 
* @ORM\ManyToOne(targetEntity="Customer", inversedBy="emails", cascade={"persist"}) 
* @ORM\JoinColumn(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(); 

Он добавляет клиента в порядок, но когда он пытается добавить электронную почту, он говорит, что не было установлено clientId. Итак, я попробовал это, и это работает:

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 объект (как я знаю, что это возможно).

+0

Какие 'strategy' вы установите в' @ GeneratedValue' аннотацию? –

+0

Как «Клиент», так и «Электронная почта» используют «АВТО» для своего идентификатора. Это то, что вы имели ввиду? –

ответ

1

Попробуйте изменить метод addEmail по умолчанию в вашем классе Customer.

Этот метод должен выглядеть следующим образом:

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

замечательный! Спасибо –

Смежные вопросы