簡體   English   中英

從Doctrine2存儲庫中獲取關聯實體集合作為數組

[英]Fetch associated entities collection from Doctrine2 repository as an array

我正在使用DDD方法開始一個小項目。 我已經在純PHP中使用Entities和ValueObjects創建了域模型。 實體引用了它們的關聯-在我的例子中,有一個Employee實體,其中包含他所屬的Teams ,我將它們保留在Employee::teams屬性中。 一切進展順利,我已經為那些具有YAML中的關聯的實體,在Symfony2和Doctrine2層中實現的存儲庫的接口等創建了映射。

當我從存儲庫(使用Doctrine的EntityManager::findAll() )而不是Team數組獲取Employee ,我收到了這些團隊的PersistentCollection 它基於PHP7構建,並且Employee::getTeams()具有array返回類型,因此我遇到了嚴重的異常。 是否可以通過某些外部偵聽器(僅Symfony層,不要將其混入域文件)或其他任何核心機制將其轉換為數組?

謝謝。

您得到ArrayCollection
http://www.doctrine-project.org/api/common/2.5/class-Doctrine.Common.Collections.ArrayCollection.html

它具有toArray()方法,因此您可以編寫

/**
 * @return Team[]
 */
public function getTeams(): array
{
    return $this->teams->toArray();
}

但是我更喜歡

/**
 * @return Team[]|ArrayCollection
 */
public function getTeams()
{
    return $this->teams;
}

如果你使用好的IDE像PhpStorm它將正確理解它自動完成它像的ArrayCollection和Team ,如果你做foreach ($employee->getTeams() as $team) {...

ArrayCollection比普通數組更強大。 例如,您可以對其進行過濾和排序,Doctrine將生成優化的SQL,因此您不必加載所有項目
http://docs.doctrine-project.org/en/latest/reference/working-with-associations.html#filtering-collections

庫巴

這似乎不是DDD問題,而是有關PHP實現細節的技術問題。 但是,請讓我跳入您的設計並嘗試為您的領域找到更好的解決方案。 您缺少建模員工與團隊之間關系的模型,我們稱其為團隊中的員工。 您的工作方式是迫使一個AR引用另一個AR,這樣員工可以管理團隊的生命周期。 可能並非如此,但在特定情況下,另一個參與者可能會更改團隊的狀態,這可能會破壞員工對團隊AR的不變性。 因此,當您使一個AR管理另一個AR生命周期時,就不應在存儲庫中找到這種依賴性,並且聚合的根現在可以迫使聚合AR保持不變。 仍然有一些需要提及的問題,但是為了簡單起見,請繼續對缺少的概念進行建模:EmployeeInTeam或任何您想調用的概念。 它引用了員工和團隊的概念性身份,因此您將來可以安全地將其刪除,可以查詢團隊中的員工以及該員工所在的團隊。 如果您需要框架或數據庫來保持一致性,那么您就無需執行DDD。 僅使用對象,而不是技術。

問候,塞巴斯蒂安。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM