我在一個需要來自多個表的數據的項目中使用 Doctrine。為了避免 N + 1 問題,我在進入視圖之前獲取我需要的所有數據。正如我在文檔中看到的,執行此操作的方法是與表進行聯接,然后使用聯接表的別名調用 addSelect。問題是,當我構建所需的查詢并調用 getResult 時,Doctrine 返回實體對象和連接實體的代理的集合,這會在視圖中的數組迭代期間導致問題,因為代理沒有與實體對象具有相同的屬性。我對這種行為真的很困惑。你能幫我解決這個問題嗎?
1 回答

心有法竹
TA貢獻1866條經驗 獲得超5個贊
您獲得代理對象是因為它們是延遲加載的,這是正確的。您不應該對它們有任何問題,因為當您迭代集合時,所有數據都應該正確設置。代理通常表現得像完全加載的實體。如果您遇到問題,也許問題出在其他地方。EAGER但是,您可以在關系中設置 fetch to來強制構建完整的實體。
@ManyToOne(targetEntity="target", fetch="EAGER")
@JoinColumn(name="target", referencedColumnName="id")
此外,您還可以使用$query->getResult(Doctrine\ORM\Query::HYDRATE_ARRAY);水合查詢中的所有對象。你也可以嘗試一下$queryBuilder->getQuery()->setHint (Query::HINT_FORCE_PARTIAL_LOAD, true)->get();
您也可以在迭代過程中自行加載代理對象。類似的東西
foreach($collection as $object) {
if ($object instanceof Doctrine\ORM\Proxy\Proxy) {
$object->__load();
}
}
但是,您可以發布您的代碼(實體、存儲庫中的查詢和視圖部分),因為代理不應該有任何問題。
- 1 回答
- 0 關注
- 97 瀏覽
添加回答
舉報
0/150
提交
取消