2012-11-03 58 views
2

使用Symfon2.0和學說的代碼,我試圖做到以下幾點:Symfony2中和學說 - 生成上插入

  1. 在插入的瞬間插入新行的數據庫
  2. ,自動生成一個代碼並插入它。
  3. 該代碼與表的ID相關。類似於<something>/row_id

我該如何輕鬆做到這一點?

我一直在嘗試Doctrine Livecycle回調。但是:

  • PrePersist仍然沒有ID。
  • PostPersist擁有這個ID,但是不知何故插入已經完成了,儘管我可以從實體中設置任何屬性,但我不知道如何讓它再次「堅持」到數據庫。

任何線索超越?

任何其他方式正確地做到這一點?

+0

數據庫觸發器? –

+0

問題是:如果你在PostPersist和PERSIST AGAIN中做了某些事情,你會得到另一個PostPersist ......在無限的時間裏。數據庫觸發器很醜,但它們工作。 –

+0

作爲一種解決方法,只有當它仍然爲空時,他才能更新實體屬性的值。 – Exander

回答

1

在你創建控制器:

if ($form->isValid()) { 
     $em = $this->getDoctrine()->getManager(); 
     $em->persist($entity); 
     $em->flush(); 

     $entity->setCode($code); 
     $em->persist($entity); 
     $em->flush(); 

     return $this->redirect($this->generateUrl('entity_show' 
      ,array('id' => $entity->getId()))); 
    } 

第二塊($實體 - > setCode ...)是你所需要的添加,將需要進行定製,以滿足您的目的

或者,你可以使用監聽器:

<?php 

namespace ormed\ormedBundle\Listener; 

use Doctrine\ORM\Event\OnFlushEventArgs; use 
Symfony\Component\DependencyInjection\Container; 

class LastModifiedListener { 

    private $container; 

    public function __construct(Container $container){$this->container = $container;} 

    public function onFlush(OnFlushEventArgs $eventArgs) 
    { 
     $entityManager = $eventArgs->getEntityManager(); 
     $unitOfWork = $entityManager->getUnitOfWork(); 

     foreach ($unitOfWork->getScheduledEntityInsertions() AS $entity) { 
      $entity->setCode($code); 

      $entityManager->persist($entity); 
      $classMetadata = $entityManager->getClassMetadata(get_class($entity)); 
      $unitOfWork->recomputeSingleEntityChangeSet($classMetadata, $entity); 
} } }