Laravel关系中嵌套项目的分页

时间:2019-12-12 08:41:43

标签: php laravel laravel-5

我是Laravel的初学者。我在我的项目Laravel 5.8中使用。 我有以下代码:

class ForumCategory extends Model
{
    use scopeActiveTrait;

    protected $quarded = ['id'];
    protected $fillable = ['company_id', 'enable', 'name', 'url_address', 'enable'];
    public $timestamps = false;

    public function themes()
    {
        return $this->hasMany('App\ForumPost', 'id_category', 'id')->where('parent_id', '=', null);
    }

    public function lastPost()
    {
        return $this->themes()->orderBy('id', 'desc')->first();
    }
}

class ForumPost extends Model
{
    use scopeActiveTrait;

    protected $quarded = ['id'];
    protected $fillable = ['company_id', 'id_category', 'parent_id', 'user_id', 'date', 'title', 'content', 'url_address', 'enable'];
    public $timestamps = true;
    protected $table = 'forum';

    public function category()
    {
        return $this->belongsTo('App\ForumCategory', 'id_category');
    }

    public function author()
    {
        return $this->belongsTo('App\User', 'user_id');
    }

    public function postCount()
    {
        return $this->hasMany('App\ForumPost', 'parent_id', 'id')->where('parent_id', '!=', null)->count();
    }
}

当我运行此功能时:

ForumCategory::with('themes')->orderBy('name', 'asc')->paginate(35);

我只有分页了。

当我显示此功能的结果时:

@foreach ($forums as $forum)
Welcome in {{ $forum->name }}<br/>
    @foreach ($forum->themes as $post)
      Post: {{ $post->title }}
@endforeach
<div class="paginationFormat"></div>
<div class="text-right">{{ $forums->links() }}</div>
@endforeach

我可以显示$个论坛的分页。

我还要显示$ post(来自关系的数据)的分页。这怎么做到的?

2 个答案:

答案 0 :(得分:0)

也许您可以查看分页文档和Laravel文档中的示例:https://laravel.com/docs/5.8/pagination

Laravel文档是一个很好的起点,因为所有文档都记录得很好,并且有很多示例。

如果您想添加一个页面以对所有帖子进行分页,只需返回带有Post::sortBy('name')->paginate()的视图并使用$posts->links()

答案 1 :(得分:0)

如果必须对Eager加载约束进行分页-它将无法工作,否则您将不得不使用该约束以将查询作为父模型/对象执行。

请参阅此链接,继续浏览。 https://laracasts.com/discuss/channels/laravel/paginate-constrained-eager-load

使用主题作为父对象并根据模型中定义的关系进行分页。

Themes::with(['forumCategory'=>function(query){
   //condition here.... 
}])-paginate(10); 

或者您在一个视图中有多个分页,但分别通过了

 $themes =  Themes::with('forumCategory')-paginate(10); 
  $forums =  ForumCategory::with('themes')->orderBy('name', 'asc')->paginate(35);

此链接Laravel Multiple Pagination in one page中的相同问题

,您可能必须编写一个统一的辅助函数来处理涉及应用程序中某个地方的两个模型的相对操作。

或者,您可以在后期模型上使用lazyEager加载。因此,当您在代码中包含此代码时,就可以懒惰地快速加载主题

$forums = ForumCategory::with('themes')->orderBy('name', 'asc')->paginate(35);
$forums->load(['themes' => function($query) {
       $query->take(5);
}]);

您还可以使用loadCount()函数。