2015-10-08 66 views
0

我有一個關於Symfony 2.3的學說和實體的問題。學說2:多次調用沖洗

據「參考文檔」章「數據庫和學說>保存相關實體」(查看這裏的例子:http://symfony.com/doc/current/book/doctrine.html) 的例子simultaneusly同時創建產品和類別表和同事product.category_id與價值在新行新分類項目的「id」。

問題是,操作控制器會在調用它時隨時創建一個新的Product和一個New Category!

爲了只需要創建一個新的產品及其CATEGORY_ID與現有的類ID相關聯(我通過URL做了一個試驗傳遞參數是這樣的:/網絡/存儲/創建/新品推薦/ 獨木舟/

這是修改routing.yml路線

acme_store_create_product_by_category: 
path:  /create/newproduct/{name}/{categoryId} 
defaults: { _controller: AcmeStoreBundle:Default:createProduct } 

我做了這樣的事情這似乎工作的罰款:

public function createProductAction($name, $categoryId) 
{ 
    $em = $this->getDoctrine()->getManager(); 

    if ($em->getRepository("AcmeStoreBundle:Category")->findOneById($categoryId)) { 

     $product = new Product(); 

     $product->setName($name); 
     $product->setPrice(220); 
     $product->setDescription("This is just a test"); 

     $em->persist($product); 

     $em->flush(); 

     $newproduct = $em->getRepository("AcmeStoreBundle:Product")->find($product->getId()); 
     /** Create new product and populate $newproduct with its data */ 


     $repository = $em->getRepository("AcmeStoreBundle:Category")->find($categoryId); 

     $newproduct->setCategory($repository); 

     $em->persist($newproduct); 

     $em->flush(); 
     /** Update the id_category field of the new product with parameter $categoryId */ 

     //exit(\Doctrine\Common\Util\Debug::dump($product)); 

     return new Response('Create product ' . $name . ' with category id ' . $categoryId); 

    } else { 

     return new Response('It doesn\'t exists any category with id ' . $categoryId); 
    } 
} 

我在這種情況下的疑問是:在同一個Action中兩次調用flush()方法是否是一個好習慣?在這種情況下,我想創建一個新的產品,從「列表框」中選擇相關類別。

預先感謝您!

回答

2

我認爲它主要取決於您的應用程序域。如果您運行flush兩次,這意味着您正在運行兩個事務。第一個是堅持產品,第二個是一個類別。因此,如果第一筆交易失敗(假設您在產品名稱上有一個唯一的關鍵字,並且您試圖持續使用相同名稱的產品,以便獲得重複的關鍵例外),那麼問問自己是否可以繼續並堅持一個類別。我不認爲我們可以在這裏輕鬆回答,因爲我認爲這取決於您的應用程序邏輯,端點應該做什麼,如果最終產品不是類別,反之亦然。

您還應該考慮如果您在第一個事務中遇到異常,您的代碼將無法處理該錯誤,並且第二個事務將因此失敗。當像重複密鑰這樣的異常發生時,所有實體都會被分離,實體管理器不再知道如何管理事物。所以你必須重置它,否則你會得到一個EntityManager is closed問題。

try { 
    // first transaction 
    $entityManager->persist($entityOne); 
    $entityManager->flush(); 
} catch (\Exception $e) { 
    /* ... handle the exception */ 
    $entityManager->resetManager(); 
} 

// now we can safely run a second transaction here 

我希望這回答:-)你的問題

+0

非常感謝弗朗西斯:-)! 我目前正在努力開啓實體類方法和ORM。與PDO或mysqli庫方法相差甚遠。 是的,我發佈的這個例子只是我的一個好奇心,它與Symfony Documentation Book中的例子嚴格相關,當然不是真正的應用:-) 無論如何,這是非常有用的提示! 我會在我的測試代碼中執行它以便記住未來的情況 –

+1

很高興幫助@FabrizioSabato :-)您是否在尋找其他信息?我問,因爲我不確定這完全回答你的問題。這可能是最好的改變問題標題,這對於來自搜索引擎的用戶也是有用的。像「Doctrine2:多次調用刷新」一樣? –

+0

好吧,現在我正在閱讀一些有關它們的webforms和beahviours的文檔。我非常肯定,這將帶來更多的信息,我很樂意在此次討論中分享。好的,根據你的建議,我會改變標題。 –