好,可能是因爲今天是星期一,也許是因爲一些人誰我與我的大腦搞亂工作,但我要問的是可能會解決一些頭疼這個完全新手的問題...Doctrine2級聯正確使用
使用Doctrine2映射,我們可以在EntityManager和Database中設置我們的級聯參數。
在這種情況下,我們有User
和Client
。一個User
屬於Client
,但一個Client
可以有多個User
。
當我們刪除Client
時,其User
必須設置爲client_id
至NULL
。
當我們刪除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一個remove
和DELETE
從我們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
,它可能有一個具有額外字段的實體,但我們將使用一個簡單的關係。
Client
有Phones
,但因爲它是一個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和數據庫確定。
我想就此提出一些建議,因爲我確信事情的運作正如我上面所解釋的,但也許我錯了,並且文檔沒有很好地解釋(至少在這一部分中)。
此外,鑑於案例和示例映射,如果有錯誤,我想提供一個有效的代碼,以改善我們的工作並告訴我的同事。
謝謝。