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

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

Doctrine 在水合作用過程中增加了額外的查詢,導致 n+1 問題與“正常”的一對一和自引用關系

Doctrine 在水合作用過程中增加了額外的查詢,導致 n+1 問題與“正常”的一對一和自引用關系

PHP
繁花不似錦 2023-03-04 10:51:37
News使用一對多的自引用方法相互關聯(一個消息是父消息,可以有多個子消息)。更重要的是 each與和News具有正常的(非自引用的)一對一關系。當我運行簡單的 DQL 時:EventGallerySELECT n FROM App\Entity\News n WHERE n.parent = :id然后通過設置getResults默認值的方法對結果進行水合HYDRATION_OBJECT,在方法內部的某處進行額外的查詢getResults。SELECT t0.* FROM event t0 WHERE t0.news_id = 2 AND ((t0.deleted_at IS NULL));SELECT t0.* FROM gallery t0 WHERE t0.news_id = 2 AND ((t0.deleted_at IS NULL));SELECT t0.* FROM event t0 WHERE t0.news_id = 1 AND ((t0.deleted_at IS NULL));SELECT t0.* FROM gallery t0 WHERE t0.news_id = 1 AND ((t0.deleted_at IS NULL));第一次查詢選擇的新聞的孩子在哪里和在哪里news_id = 1。news_id = 2News也沒有自引用的一對多關系(我在這里忽略了它們),但是 hydration 沒有對它們進行額外的查詢。parent僅當語句中涉及關系時才會出現此問題where。如何重現// news Entity/** * @ORM\Entity(repositoryClass="App\Repository\NewsRepository") * @ORM\Table(uniqueConstraints={@UniqueConstraint(name="news_slug_deleted", columns={"slug","deleted_at"})}) *class News {    use SoftDeleteableEntity;    /**     * @ORM\Id()     * @ORM\GeneratedValue()     * @ORM\Column(type="integer")     */    private $id;    /**     * @ORM\Column(type="string", length=255)     */    private $title;    /**     * @Gedmo\Slug(fields={"title"})     * @ORM\Column(length=128)     */    private $slug;/**     * @ORM\OneToOne(targetEntity="App\Entity\Gallery", mappedBy="news", cascade={"persist", "remove"}, orphanRemoval=true)     *     * @var Gallery     */    private $gallery;    /**     * @ORM\OneToOne(targetEntity="App\Entity\Event", mappedBy="news", cascade={"persist", "remove"}, orphanRemoval=true)     *     * @var Event     */    private $event;    /**     * One News has Many News.     * @ORM\OneToMany(targetEntity="News", mappedBy="parent")     */    private $children;    /**     * Many News have One News.     * @ORM\ManyToOne(targetEntity="News", inversedBy="children")     * @ORM\JoinColumn(name="parent_id", referencedColumnName="id", nullable=true)     */    private $parent;}
查看完整描述

1 回答

?
慕娘9325324

TA貢獻1783條經驗 獲得超4個贊

您在該實體中有幾個反向 OneToOne 關系。


反向 OneToOne 關系不能被 Doctrine 延遲加載,并且很容易成為性能問題。


如果您真的需要將這些關系映射到反面(而不僅僅是在擁有方),請確保明確地進行適當的連接,或者將這些關聯標記為以便FETCH=EAGERDoctrine 為您進行連接。


例如,避免可怕的“n+1”問題的查詢是:


SELECT n, g, e

? ? FROM App\Entity\News n

? ? LEFT JOIN n.gallery g

? ? LEFT JOIN n.event e

WHERE n.parent = :id



查看完整回答
反對 回復 2023-03-04
  • 1 回答
  • 0 關注
  • 127 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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