簡體   English   中英

doctrine2使用過多的SQL查詢加載與獲取模式一對多的關聯

[英]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查詢來加載地址實體?

我在用:

  • symfony v2.0.9
  • 學說共同的2.1.4
  • 學說 - dbal 2.1.5
  • 學說2.1.5

當前版本的學說不支持這一點。

在doctrine2問題跟蹤器中有關於此的功能請求

所以我希望它能盡快實施。

根據你的鏈接:

您可以標記臨時獲取 的多對一或一對一關聯,以使用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 )。

更新(2017年)

正如指出的GusDeCoolwebDEVILopers的意見, fetch屬性現在支持@OneToMany 上述答案現已過時。

我有完全相同的問題,並將Zend Framework 2中的學說模塊更新為2.5版,現在一切正常。 你可以在這里查看我的問題

暫無
暫無

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

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