0

フォームのコレクションを埋め込もうとしていますが、新しく作成されたオブジェクトを永続化するのに問題があります。

ACustomerには多く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();

顧客を追加しますが、Eメールを追加しようとすると、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ます(私が知っているように)。

4

1 に答える 1

1

Customer クラスのデフォルトの「addEmail」メソッドを変更してみてください。

このメソッドは次のようになります。

public function addEmail($email)
{
  $email->setCustomer($this);
  $this->emails[] = $email;
  return $this;
}
于 2013-03-19T10:39:16.043 に答える