2012-08-08 110 views
0

我正在使用來自Doctrine查詢的實體對象,並且最終得到了一個非常大的數組,其中包含來自所有相關實體的所有信息。這最終是一個巨大的數據樹...我怎麼能限制這個?避免列出所有關係中的所有數據?Doctrine/Symfony 2:具有太多關係的實體

+0

我不知道是否有幫助,但你可以嘗試做' - >的getResult(學說\ ORM \查詢:: HYDRATE_ARRAY)'在查詢結束,結果將作爲數組返回 – Gigala 2013-10-09 13:49:54

回答

1

您可以隨時移除不需要的關聯(這是加速Doctrine的最佳做法)。或者你也可以選擇只在您的表示層需要的字段(如只讀數據):

public function getAll() 
{ 
    $qb = $this->createQueryBuilder('u'); // Where are in User custom repository 

    return $qb 
     ->select(array('u.id', 'u.first', 'u.last')) 
     ->getQuery() 
      ->getResult(); 
} 

如果您仍然需要使用對象的工作(或對於複雜的查詢,需要普通的SQL)的可能性是填充只需要域對象的屬性(最終是關聯/嵌套集合)。

一個例子,更多native SQL:(?)

public function getAll() 
{ 
    $mapping = new \Doctrine\ORM\Query\ResultSetMapping(); 

    $mapping->addEntityResult('Acme\HelloBundle\User', 'e'); 

    $mapping->addFieldResult('e', 'id', 'id'); 
    $mapping->addFieldResult('e', 'first', 'first'); 
    $mapping->addFieldResult('e', 'last', 'last'); 

    $sql = "SELECT id, first, last FROM user "; 

    $result = $this->_em->createNativeQuery($sql, $mapping)->getResult(); 

    // Or hust return $result itself (array) 
    return new \Doctrine\Common\Collections\ArrayCollection($result); 
} 

當然的disadvance是使用原生SQL的。我不相信ResultSetMapping可以用於DQL。

編輯:看看http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/best-practices.html

+0

我正在尋找一種簡單的方法來在Doctrine中禁用延遲加載,或者獲得最大關係深度。可能嗎? – vinnylinux 2012-08-08 22:58:01

+0

@vinnylinux如果我正確地記得它,延遲加載是當你選擇數據的一個子集,然後,當訪問未加載的屬性或關聯時,doctrine將爲你加載(在另外的查詢中)所有數據。所以懶加載是一件好事。正如我所說,這取決於。什麼是數據用於? – gremo 2012-08-08 23:06:35

+0

當你使用類似JMSSerializer包的序列化數據時,這肯定不是一件好事。用具有各種關係的相當大的數據集測試自己。它開始遞歸。 – vinnylinux 2012-08-08 23:26:05

相關問題