希望有人可以告诉我如何能够完成我想要做的事情。基本上我需要列出数据库中的记录,更具体地说是新闻帖子,但是我需要将这些帖子按类别列为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
....
有人可以暗示我该怎么做吗?
答案 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; 在您的代码中,您将使用此方法:
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"