【发布时间】:2023-03-07 23:17:01
【问题描述】:
我有一个新闻网站,其中包含主页上帖子的概述。带有分页的简单 Eloquent 集合,说实话没什么特别的(模型 = 帖子)。 现在添加了一个新模型(视频),应该将其添加到主页上的帖子概述中。
所以我们的目标是获得一个有说服力的帖子集合和一个有说服力的视频集合(它们彼此不相关),然后将它们组合成一个集合并对其进行分页。
我环顾四周并尝试了几件事,但似乎都没有奏效。
大多数时候,他们说要使用$collection->merge($otherCollection),但这不起作用,因为如果有相同 id 的帖子,则不会显示 id 为 1 的视频,情况就是这样。
另一种选择是定义关系,但由于它们根本不相关,因此也不起作用。
我目前所拥有的,只是为了获取帖子:
if ($highlighted) {
$posts = Post::where([
['status_id', '=', 4],
['published_at', '<=', Carbon::now()],
['id', '!=', $highlighted->id],
])->latest('published_at')->paginate(14);
} else {
$posts = Post::where([
['status_id', '=', 4],
['published_at', '<=', Carbon::now()]
])->latest('published_at')->paginate(15);
}
现在我想以类似的方式检索视频
$videos = Video::where([
['status_id', '=', 4],
['published_at', '<=', Carbon::now()]
])->latest('published_at')->paginate(15);
然后将它们合并到一个 Eloquent 集合中,并对总数进行分页,而不是单独对视频和帖子进行分页
类似:
$collected = $videos + $posts 然后->latest('published_at')->paginate(15)
(为了这篇文章的篇幅,我没有添加任何我尝试过的示例,因为我觉得这不是要走的路,使用->merge()。我还需要一个雄辩的集合,使用纯数据库查询不起作用,除非可以将其转换为 Eloquent 集合)
也许雄辩的集合不可能,我应该使用查询生成器?
非常感谢任何反馈/帮助。 (请随时询问额外的代码/信息)
【问题讨论】:
-
您是否尝试过运行两个查询并将它们组合成一个数组?然后只循环遍历刀片上的数组?
-
这就是问题所在。
paginate将运行 2 个查询。 1)计算总预期结果(因此知道有多少总页面和2)当前页面的实际查询(默认为第一个)。这是像您这样的联合类型查询的问题,因此您的选择是(a)手动创建查询以计算所有结果的长度,然后使用union和限制进行另一个手动查询,然后手动创建基于LengthAwarePaginator对象结果或(b)stackoverflow.com/questions/30420505/…