亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何迭代與代理和對象混合的 Doctrine 集合

如何迭代與代理和對象混合的 Doctrine 集合

PHP
呼如林 2023-09-22 17:52:59
我在一個需要來自多個表的數據的項目中使用 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();

    }

}

但是,您可以發布您的代碼(實體、存儲庫中的查詢和視圖部分),因為代理不應該有任何問題。


查看完整回答
反對 回復 2023-09-22
  • 1 回答
  • 0 關注
  • 97 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號