问题描述
我在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
此查询有两个问题。
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 (将#修改为@)