将两个雄辩的集合合并为单个集合并分页

时间:2019-03-28 23:08:59

标签: php laravel eloquent

我有一个新闻网站,上面有主页上的帖子概述。简单的雄辩式分页收藏,说实话没什么特别的(model = Post)。 现在,已经添加了一个新模型(视频),应该将其添加到首页上的帖子概述中。

因此,目标是获得大量的帖子和大量的视频(彼此无关),然后将它们合并为一个集合并对其进行分页。

我环顾四周并尝试了一些方法,但是似乎都没有用。 大多数情况下,他们会说使用float f {3.422222222222222222222222222222246454}; // no warning/ error although it should definitely lose precision float f2 {static_cast<double>(std::numeric_limits<float>::max()) + 1.0}; // no warning/ error float f3 {3.5e38}; // error: narrowing conversion of '3.5e+38' from 'double' to 'float' inside { } [-Wnarrowing] ,但这是行不通的,因为如果帖子中具有相同的ID,则不会显示ID为1的视频。

另一种选择是定义一个关系,但是由于它们根本不相关,因此也不起作用。

我现在拥有的只是获得帖子:

$collection->merge($otherCollection)

现在我想以类似方式检索视频

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); ,然后$collected = $videos + $posts

(出于这篇文章的篇幅,我没有添加我尝试过的任何示例,并且由于使用->latest('published_at')->paginate(15)感觉不可行,因此我还需要一个雄辩的集合,则无法使用纯DB查询,除非可以将其转换为Eloquent集合)

也许无法通过雄辩的集合实现,我应该使用查询生成器?

任何反馈/帮助都非常感谢。 (随时询问其他代码/信息)

2 个答案:

答案 0 :(得分:1)

您可以发送两个不同的查询,将两个结果合并到Illuminate\Support\Collection中,然后合并到sortBy('published_at')中,然后使用skip(($numPage - 1) * $perPage)limit($perPage)进行分页。

让我知道是否有帮助

答案 1 :(得分:0)

由于这里发表了评论和回答,我设法找到了一个可行的解决方案:

为了检索数据,我做了以下操作:

$posts = Post::where([
    ['status_id', '=', 4],
    ['published_at', '<=', Carbon::now()]
])->get();
$videos = Video::where([
    ['status_id', '=', 4],
    ['published_at', '<=', Carbon::now()]
])->get();

$collected = $videos->union($posts)->sortByDesc('published_at');

如对此问题的评论中所述:https://stackoverflow.com/a/30421846/4666299我使用https://gist.github.com/simonhamp/549e8821946e2c40a617c85d2cf5af5e进行分页。

这样我就可以做到:

$items = (collect($collected))->paginate(15);

现在,我有一个可以在Blade中循环播放的集合。 感谢您的所有帮助!