2015-03-03 2 views
0

Я работаю над проектом с использованием Symfony2. Но у меня проблема. У меня есть объект Purchase, а другой - TypePurchase. У них есть отношения OneToMany, но когда я просматриваю таблицу TypePurchase, идентификатор объекта Purchase не сохраняется. Это значение равно null. Я уже пробовал $ types-> setPurchase ($ this) в методе addType Purchase. Но это дает мне результат, что только первый добавленный объект get имеет идентификатор, а следующий - снова null.ID не сохраняется в отношениях OneToMany

Это мое поле и поле идентификатора в Purchase:

/** 
* @ORM\OneToMany(targetEntity="TypePurchase", mappedBy="purchase", cascade={"persist", "remove" }) 
*/ 
protected $types; 

Это то, что я уже добавил, но не работает в полной мере:

/** 
* Add types 
* 
* @param \Wood\AdminBundle\Entity\TypePurchase $types 
* @return Purchase 
*/ 
public function addType(\Wood\AdminBundle\Entity\TypePurchase $types) 
{ 
    $this->types[] = $types; 
    $types->setPurchase($this); 
    return $this; 
} 

И это мое поле внутри TypePurchase:

/** 
* @ORM\ManyToOne(targetEntity="Purchase", inversedBy="types", cascade={"persist", "remove" }) 
* @ORM\JoinColumn(referencedColumnName="id") 
*/ 
protected $purchase; 

Отредактировано: My ID field in Purchase

/** 
* @ORM\Id 
* @ORM\Column(type="integer") 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
protected $id; 

Это мой createAction в контроллере Purchase:

/** 
* @param Request $request 
* @return \Symfony\Component\HttpFoundation\Response 
*/ 
public function createAction(Request $request) 
{ 
    $purchase = new Purchase(); 
    $purchase->addType(new TypePurchase()); 
    $form = $this->createForm(new PurchaseType(), $purchase); 

    $form->handleRequest($request); 
    if($form->isValid()) { 
     $purchase->setUser($this->getUser()); 
     $purchaseService = $this->get('woodadmin.purchaseservice'); 
     $purchaseService->createPurchase($purchase); 

     $flash = $this->get('braincrafted_bootstrap.flash'); 
     $flash->success('De inkoop is succesvol geregistreerd.'); 

     $now = time(); 
     if($purchase->getSupplier() != null) { 
      $date = $purchase->getSupplier()->getFscExpiration()->format('U'); 
      $datediff = $date - $now; 
      $diff = floor($datediff/(60 * 60 * 24)); 

      if ($diff <= 14) { 
       $flash->alert('Let op, het FSC-certificaat van de leverancier ' . htmlentities($purchase->getSupplier()->getName()) . ' verloopt bijna of is al verlopen.'); 
      } 

      $now2 = time(); 
      $date2 = $purchase->getSupplier()->getPefcExpiration()->format('U'); 
      $datediff2 = $date2 - $now2; 
      $diff2 = floor($datediff2/(60 * 60 * 24)); 

      if ($diff2 <= 14) { 
       $flash->alert('Let op, Het PEFC-certificaat van de leverancier ' . htmlentities($purchase->getSupplier()->getName()) . ' verloopt bijna of is al verlopen.'); 
      } 
     } 

     return $this->redirect($this->generateUrl('wood_admin_purchase_list')); 
    } 
    return $this->render('WoodAdminBundle:Purchase:create.html.twig', array('title' => 'Inkoop registreren', 'page' => 'purchases', 'form' => $form->createView())); 
} 

Моя PurchaseService часть, где я настойчив объект купли-продажи:

public function createPurchase(\Wood\AdminBundle\Entity\Purchase $purchase) { 
    $this->entityManager->persist($purchase); 
    $this->entityManager->flush(); 
} 
+0

Покажите нам ваши Controler (или услугу) .Затем мы можем увидеть, как вам удается создать/persit свои объекты. Кроме того, мы можем увидеть определение вашего идентификатора внутри ваших объектов. –

+0

Я обновил вопрос. –

+0

', но когда я заглядываю в таблицу TypePurchase, идентификатор объекта Purchase не сохраняется. Я предполагаю, что вы имеете в виду', но когда я просматриваю таблицу Purchase, идентификатор объекта TypePurchase не сохраняется ' – Patrick

ответ

0

Вы должны сохраняться ваши TypePurchase сущность, прежде чем сохраняться ваш Purchase Сущность.

Следующий пример является расширением для примера комментариев пользователя этой главы. Предположим, что в нашем приложении пользователь создается всякий раз, когда пишет свой первый комментарий. В этом случае мы будем использовать следующий код:

<?php 
$user = new User(); 
$myFirstComment = new Comment(); 
$user->addComment($myFirstComment); 

$em->persist($user); 
$em->persist($myFirstComment); 
$em->flush(); 

Даже если вы упорствовать новый пользователь, который содержит наш новый комментарий этого кода потерпит неудачу, если убрать вызов EntityManager # упорствовать ($ myFirstComment). Doctrine 2 не является каскадом Операция persist для всех Вложенные объекты, которые являются новыми также.

http://doctrine-orm.readthedocs.org/en/latest/reference/working-with-associations.html

$purchase = new Purchase(); 
$typePurchase = new TypePurchase(); 
$this->enityManager->persist($typePurchase); 
$purchase->addType($typePurchase); 
$form = $this->createForm(new PurchaseType(), $purchase); 
Смежные вопросы