使用双重加载的Laravel分页

时间:2016-06-22 21:24:58

标签: php laravel pagination laravel-5.2 eager-loading

我在ForumController中使用以下代码:

public function boardIndex($id)
{
    $container = ForumBoard::with([
        'topics' => function($query)
            {
                $query->orderBy('created_at', 'desc');
                $query->paginate(10);
            },
        'children' => function($query)
            {
                $query->orderBy('position', 'asc');
            }
        ])->findOrFail($id);

    return view('forum.board.index', compact('container'));
}

它按预期工作,我可以通过将?page=2附加到url的末尾来手动分页,但是如果我想使用{!! $container->topics->render() !!}在我的视图中渲染分页符,我会收到以下错误:< / p>

ErrorException in Macroable.php line 81:
Method render does not exist. (View: C:\xampp\htdocs\see\resources\views\forum\board\index.blade.php)

修改

感谢您的帮助! 这是我最后的工作代码(它甚至只使用了4个数据库查询而不是5个):

public function boardIndex($id)
{
    $board = ForumBoard::findOrFail($id);
    $topics = $board->topics()->latest()->paginate(11);
    $children = $board->children()->oldest('position')->get();

    return view('forum.board.index', compact('board', 'topics', 'children'));
}

1 个答案:

答案 0 :(得分:1)

我无法在任何地方找到Paginator实例。

显然,当您在闭包内部进行分页时,只会存储分页结果。

我提出了一个解决方案,在我看来并不优雅,但可能会有所帮助:

<?php
public function index()
{
    $descendantPaginator = null;
    $user = User::with([
        'descendants' => function ($query) use (&$descendantPaginator) {
            $query->orderBy('created_at', 'DESC');
            $descendantPaginator = $query->paginate(10);
        }
    ])->findOrFail(1);

    return view('home.index', compact('user', 'descendantPaginator'));
}

在您看来:

{!! $descendantPaginator->links() !!}

我建议采用以下策略:

<?php
public function index()
{
    $user = User::findOrFail(1);
    $descendants = $user->descendants()->latest()->paginate(10);
    return view('home.index', compact('user', 'descendants'));
}

然后在你看来:

{!! $descendants->links() !!}