按类别和nr自定义列表帖子。帖子

时间:2017-03-02 21:46:42

标签: php laravel laravel-5 eloquent laravel-5.3

希望有人可以告诉我如何能够完成我想要做的事情。基本上我需要列出数据库中的记录,更具体地说是新闻帖子,但是我需要将这些帖子按类别列为6组,其中第一篇文章是特色帖子。

我需要按类别查询,在获得此类别的帖子后,我需要按照6个帖子分组,其中第一个是特色(每个帖子都有一个列,用于标识哪个类别或功能是真还是假。< / p>

所以我想首先在我的Category模型中创建一个名为posts的方法:

public function posts(){
    return $this->hasMany('App\Post');
}

所以我的控制器,例如主页,我可以这样做:

$categories = Category::all();

而且在我看来刀片上我能做到:

@foreach($categories as $category)
    @foreach ($category->posts() as $post)
        {{$post->title}}
    @endforeach 
@endforeach 

所以现在我需要在6个帖子中对每个类别进行分组,其中第一个是此类别的特色帖子。 最终结果模式:(例如:总类别为4(A,B,C,D))

```
Category A
Feature Post | Normal Post | Normal Post | Normal Post | Normal Post | Normal Post

Category B
Feature Post | Normal Post | Normal Post | Normal Post | Normal Post | Normal Post

Category C
Feature Post | Normal Post | Normal Post | Normal Post | Normal Post | Normal Post

Category D
Feature Post | Normal Post | Normal Post | Normal Post | Normal Post | Normal Post

Category A
Feature Post | Normal Post | Normal Post | Normal Post | Normal Post | Normal Post

Category B
Feature Post | Normal Post | Normal Post | Normal Post | Normal Post | Normal Post

Category C
Feature Post | Normal Post | Normal Post | Normal Post | Normal Post | Normal Post

Category D
Feature Post | Normal Post | Normal Post | Normal Post | Normal Post | Normal Post

....

有人可以暗示我该怎么做吗?

3 个答案:

答案 0 :(得分:0)

我的建议是改变关系或创建一个新关系

public function latestPosts(){
    return $this->hasMany('App\Post')->orderBy('featured')->take(6);
}

但是在这里,你必须确保每个类别只有一个特色帖子。如果某个类别的帖子超过1个,则以后的所有帖子都将首先显示。

否则

$category->latestPosts()

会给你想要你想要的。

答案 1 :(得分:0)

回答您的问题:

在名为Category的{​​{1}}模型中创建方法:

postsChunck

此方法将:

  • 查询该类别的所有帖子;
  • public function postsChunck() { return $this->posts()->orderBy('is_featured', 'DESC')->limit(6)->get(); } 列排序。这应首先显示特色的,因为(MySql)数据库中的布尔值存储为0或1;
  • 只获得查询的前6个结果。

在您的代码中,您将使用此方法:

is_featured

<强> Recomendation

在查询类别时,您应该热切地加载其帖子,并在执行此操作时限制加载的帖子数量。这将减少执行以获取每个类别的帖子所需的查询量。

@foreach($categories as $category)
    @foreach ($category->postsChunck() as $post)
        {{$post->title}}
    @endforeach 
@endforeach 

然后你会在你的视图中找到通常的代码:

$categories = Category::with(['posts' => function ($query) {

    $query->orderBy('is_featured', 'DESC')->limit(6);

}])->get();

不同之处在于我们没有使用方法@foreach($categories as $category) @foreach ($category->posts as $post) {{$post->title}} @endforeach @endforeach ,而是使用魔术属性posts,之前已经热切地加载了帖子数据。

答案 2 :(得分:0)

首先,从Eager Loading帖子开始,这样您就不会遇到针对视图中每个循环运行该相关查询的n + 1问题。

@foreach($categories as $category)
    @php
        $featuredPost = $category->posts->first(function($post) {
            return $post->featured;
        });
    @endphp
    <h1>{{$featuredPost->title}}</h1>
    <h2>FEATURED POST!</h2>
    @foreach ($category->posts->where('featured', false)->chunk(5) as $post)
        <h1>{{$post->title}}</h1>
        <h2>Not SO FEATURED POST!</h2>
    @endforeach 
@endforeach 

然后在您的视图中,您可以对结果进行分块,并使用$loop变量检查功能如下:

"DJANGO_SETTINGS_MODULE"