【问题标题】:How to paginate through joined records on laravel?如何通过 laravel 上的连接记录进行分页?
【发布时间】:2014-08-17 21:05:25
【问题描述】:

我正在使用 Laravel 4.1.x 并且我在标签和照片之间有很多和属于多的关系(一张照片属于许多标签,一个标签属于许多照片)。我正在使用带有 tag_id 和 photo_id 的数据透视表

我知道如何对标签进行分页,使用:

Tag::paginate($limit);

我可以使用以下方法获取一个包含所有相关照片的标签:

Tag::find($id);

但我现在想做的是检索属于一个标签的所有照片,但对它们进行分页。因此,它类似于我展示的第二个代码,但带有页面和限制参数。

例如,我想查看属于 id=1 标记的前 15 张照片,然后能够选择第二个 15。

更新: 根据提供的答案,我尝试使用->photos()->paginate(),但使用它,它不会从标签返回其余信息(名称、描述等)。

我已经能够使用:

$tag = Tag::findOrFail($id)->toArray();
$tag['photos'] = Tag::findOrFail($id)->photos()->paginate($limit)->toArray();

但我不确定是否有其他方法可以做到这一点,以及这是否会产生额外的查询。

【问题讨论】:

    标签: php laravel orm pagination eloquent


    【解决方案1】:

    你试过了吗……

    Tag::find(1)->photos()->paginate(15);
    

    如果需要在标签上显示信息,有几种方法。急切加载通常是最好的,但在这种情况下,因为我们知道标签 ID,所以我们不会面临 n+1 问题,因此它可能看起来比实际需要的更混乱。

    $limit = 15;
    $tag = Tag::with(array('photos' => function($q) use ($limit)
    {
        $q->paginate($limit);
    }))->find(1);
    
        // Use
    echo $tag->name;
    foreach($tag->photos as $photo) {
        echo $photo->description;
    }
    

    或者你可以像我们之前做的那样做,只是把它分开一点来保存各个部分。

    $tag = Tag::find(1);
    $photos = $tag->photos()->paginate(15);
    
    // use
    echo $tag->name;
    foreach($photos as $photo) {
        echo $photo->description;
    }
    

    【讨论】:

    • 看起来很简单,这就是我的问题的答案。我不知道photos()函数的使用。
    • 我用一个相关的问题更新了问题,请检查您是否知道更好的解决方法
    猜你喜欢
    • 1970-01-01
    • 2015-09-23
    • 1970-01-01
    • 2017-02-19
    • 2014-09-29
    • 2022-06-14
    • 2018-03-21
    • 2018-06-09
    • 1970-01-01
    相关资源
    最近更新 更多