2016-02-29 92 views
0

好,可能是因爲今天是星期一,也許是因爲一些人誰我與我的大腦搞亂工作,但我要問的是可能會解決一些頭疼這個完全新手的問題...Doctrine2級聯正確使用

使用Doctrine2映射,我們可以在EntityManager和Database中設置我們的級聯參數。

在這種情況下,我們有UserClient。一個User屬於Client,但一個Client可以有多個User

當我們刪除Client時,其User必須設置爲client_idNULL

當我們刪除User時,它只會刪除User

User entity

manyToOne: 
    client: 
     targetEntity: AppBundle\Entity\Client 
     inversedBy: users 
     joinColumn: 
      name: client_id 
      referencedColumnName: id 
      onDelete: SET NULL 
     cascade: ["persist"] 

Client entity

oneToMany: 
    users: 
     targetEntity: AppBundle\Entity\User 
     mappedBy: client 
     cascade: ["persist", "remove"] 

這個映射,應該用我們的EntityManager一個removeDELETE從我們DATABSE上述情況OK,對不對?

我們有另一個案例,使用oneToOne的關係。在這種情況下,我們有一個Client和一個Shop實體。一個Client只能有一個Shop,反之亦然。

當我們刪除Client時,它的Shop也必須刪除。

當我們刪除Shop,它必須設置爲NULL的關係,而是因爲我們不具備反轉的側Shop,什麼也沒有發生,我們有它的Client,所以它的Shop誰擁有client_id

Shop entity

oneToOne: 
    client: 
     targetEntity: AppBundle\Entity\Client 
     cascade: ["persist", "remove"] 
     inversedBy: shop 
     joinColumn: 
      name: client_id 
      referencedColumnName: id 

Client entity

oneToOne: 
    shop: 
     targetEntity: AppBundle\Entity\Shop 
     mappedBy: client 
     cascade: ["persist", "remove"] 

據我所知,這個映射將打破,因爲當一個Shop被刪除它將刪除Client記錄,這是不應該的,因爲我們只想要Shop被刪除,而不是兩個。

最後但並非最不重要的,我們有一個oneToMany單向關係,它與一個連接表成爲manyToMany,它可能有一個具有額外字段的實體,但我們將使用一個簡單的關係。

ClientPhones,但因爲它是一個ManyToMany關係,這意味着n個Client可以有n個Phone,反之亦然名爲client_has_phone連接表。

當我們刪除Phone時,我們想從我們的連接表client_has_phone中刪除該關係。當我們刪除Client時,也會發生同樣的情況,那種關係永遠消失了。

Client entity

manyToMany: 
    phones: 
     targetEntity: AppBundle\Entity\Phone 
     cascade: ["persist", "remove"] 
     joinTable: 
      name: client_has_phone 
      joinColumns: 
       client_id: 
        referencedColumnName: id 
        onDelete: CASCADE 
      inverseJoinColumns: 
       phone_id: 
        referencedColumnName: id 
        onDelete: CASCADE 

這個映射,應該是在這兩個的EntityManager和數據庫確定。

我想就此提出一些建議,因爲我確信事情的運作正如我上面所解釋的,但也許我錯了,並且文檔沒有很好地解釋(至少在這一部分中)。

此外,鑑於案例和示例映射,如果有錯誤,我想提供一個有效的代碼,以改善我們的工作並告訴我的同事。

謝謝。

回答

0

那麼這是一個三個問題,但你去那裏:

  1. cascade=remove將刪除所有UserClient被刪除,否則看起來不錯
  2. 考慮這個問題:

Shop entity

oneToOne: 
    client: 
     targetEntity: AppBundle\Entity\Client 
     cascade: ["persist", "remove"] 
     mappedBy: shop 

Client entity

oneToOne: 
    shop: 
     targetEntity: AppBundle\Entity\Shop 
     inversedBy: client 
     joinColumn: 
      name: shop_id 
      referencedColumnName: id 
      onDelete: SET NULL 
     cascade: ["persist"] 

現在DB的ON DELETENULLShop被刪除和學說的cascade=removeClient被刪除將刪除Shop

  • 似乎確定以我