原则DQL-防止笛卡尔加入

问题描述

我在Doctrince中有以下课程(简化):

class Video
{
    /**
     * @ORM\ManyToOne(targetEntity=Channel::class,inversedBy="videos",fetch="LAZY")
     * @ORM\JoinColumn(nullable=false)
     */
    private ?Channel $channel;
}

class Channel
{
    /**
     * @ORM\OnetoMany(targetEntity=Video::class,mappedBy="channel",fetch="LAZY")
     * @OrderBy({"updated" = "DESC"})
     */
    private Collection $videos;

   /**
    * @ORM\ManyToMany(targetEntity=User::class)
    */
   private Collection $users;
}

class User implements UserInterface
{    
    /**
     * @ORM\ManyToMany(targetEntity=Channel::class)
     */
    private Collection $subscriptions;
}

结构是这样的:https://i.imgur.com/je40Up6.png 基本上每个用户都有许多订阅(频道),每个频道可以被许多用户订阅。 频道有很多视频,但视频只有一个频道。

现在,我想编写DQL,该DQL将为用户加载100个最新视频。 我有这个简单的DQL:

SELECT v FROM App\Entity\Video v 
JOIN App\Entity\Channel ch 
JOIN App\Entity\User u
WHERE u = :user
ORDER BY v.updated DESC

查询有两个问题。

一个也是最大的一个是它将转换为以下sql

SELECT v.* FROM video v INNER JOIN channel ch INNER JOIN user u WHERE i.id = 1 ORDER BY v.updated DESC LIMIT 100;

会忽略表user_channel,因此不仅会返回ID为1的用户,还会返回每个用户的视频。

第二个问题是$ user-> channel没有被水化,我最终遇到了1 + n问题。根据文档(https://www.doctrine-project.org/projects/doctrine-orm/en/2.7/reference/dql-doctrine-query-language.html#result-format),将DQL更改为SELECT v,ch FROM ...应该填充$ channel属性,但所做的只是$ query-> getResult()返回的数组同时包含Video和Channel对象。

您知道如何解决此问题,尤其是第一个问题吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)