[英]doctrine2 loads one-to-many associations with fetch mode eager using too many SQL queries
我正在加載許多實體的列表。
這些實體與其他實體具有一對多關聯。
我想在一個SQL查詢中加載所有這些其他實體(而不是對第一個列表中的每個實體進行一次查詢)。
如doctrine2文檔中所述: http : //www.doctrine-project.org/docs/orm/2.1/en/reference/dql-doctrine-query-language.html#temporarily-change-fetch-mode-in-dql這應該可以通過“EAGER”加載來實現。
但它沒有按照描述的那樣工作。
我的代碼:
class User{
/**
* @ORM\OneToMany(targetEntity="Address", mappedBy="user", indexBy="id", fetch="EAGER")
*/
protected $addresses;
public function __construct(){
$this->addresses = new ArrayCollection();
}
}
class Address{
/**
* @ORM\ManyToOne(targetEntity="User", inversedBy="addresses")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="UserId", referencedColumnName="id")
* })
*/
private $user;
}
class UserRepository{
public function findUsersWithAddresses(){
return $this->getEntityManager()
->createQuery('SELECT u FROM MyBundle:User u ORDER BY u.name ASC')
->setFetchMode('MyBundle\Entity\User', 'addresses', \Doctrine\ORM\Mapping\ClassMetadata::FETCH_EAGER)
->setMaxResults(10)
->getResult();
}
}
UserRepository :: findUsersWithAddresses()方法執行11個SQL查詢。
如何告訴Doctrine只使用一個SQL查詢來加載地址實體?
我在用:
根據你的鏈接:
您可以標記臨時獲取 的多對一或一對一關聯,以使用WHERE .. IN查詢批量獲取這些實體
不幸的是,看起來當前版本的Doctrine不支持在
一對多集合上進行預先加載。
這個頁面似乎證實了這個假設:
@OneToMany
必需屬性:
targetEntity :引用的目標實體的FQCN。如果兩個類都在同一名稱空間中,則可以是非限定類名。重要提示:沒有領先的反斜杠!
可選屬性:
級聯 :級聯選項orphanRemoval :Boolean,指定是否應該通過Doctrine刪除孤立,未連接到任何擁有實例的反向OneToOne實體。默認為false。mappedBy :此選項指定targetEntity上的屬性名稱,該屬性是此關系的擁有方。它是關系反面的必需屬性。
@OneToMany
注釋不具有
fetch
屬性,而不是
@OneToOne
和
@ManyToOne
。
我只是注意到你實際上可以在DQL中使用顯式LEFT JOIN
來獲取相關實體:
SELECT u, a FROM User u LEFT JOIN u.addresses a
使用LEFT JOIN
,而不是內部JOIN
,或者從結果集中省略具有空集合的實體(沒有任何Address
User
)。
正如指出的GusDeCool和webDEVILopers的意見, fetch
屬性現在支持在@OneToMany
。 上述答案現已過時。
我有完全相同的問題,並將Zend Framework 2中的學說模塊更新為2.5版,現在一切正常。 你可以在這里查看我的問題
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.