Laravel 使用双重预先加载的分页
Laravel pagination using double 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() !!}
在我的视图中呈现分页器,我收到以下错误:
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'));
}
我在任何地方都找不到 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() !!}
我在我的 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() !!}
在我的视图中呈现分页器,我收到以下错误:
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'));
}
我在任何地方都找不到 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() !!}