如何为每种类型的 Laravel API 获取 5 个最新帖子?
Posted
技术标签:
【中文标题】如何为每种类型的 Laravel API 获取 5 个最新帖子?【英文标题】:How to get 5 latest post for each genre Laravel API? 【发布时间】:2018-05-28 19:49:53 【问题描述】:我正在使用 Laravel 5.4 作为 API 和 Angular 5 构建一个应用程序(我的课程项目)。我的项目是一个音乐博客。我需要满足要求,例如拥有类别和子类别。
所以,我有流派、乐队和帖子。对于我的主页我想为每个类别显示 5 个最新帖子。
我的桌子
流派(id,名称,slug); bands(id, name, slug,genre_id); posts(id、title、content、band_id、slug、created_at、updated_at)。我的人际关系
流派.php
protected $fillable = ['name', 'slug'];
public function bands()
return $this->hasMany('App\Models\Band');
public function posts()
return $this->hasManyThrough('App\Models\Post', 'App\Models\Band');
Band.php
protected $fillable = ['name','slug','genre_id'];
public function genre()
return $this->belongsTo('App\Models\Genre');
public function posts()
return $this->hasMany('App\Models\Post');
Post.php
protected $fillable = ['title','content','image','band_id','slug'];
public function band()
return $this->belongsTo('App\Models\Band');
在我的 HomeController 中我尝试过:
$latest5PostsPerGenre = Genre::with([
'posts' => function($query)
$query->take(5)
->orderBy('id', 'desc')
->get(['posts.id', 'title']);
])->orderBy('name')
->get();
但它将所有类型的帖子总数限制为 5 个。所以,有些类型根本没有帖子。
$latest5PostsPerGenre = Genre::with('latest5Posts')
->orderBy('name')
->get();
在流派模型中使用此类方法:
public function latest5Posts()
return $this->hasManyThrough('App\Models\Post', 'App\Models\Band')
->orderBy('id', 'desc')
->take(5)
->get();
or
public function latest5Posts()
return $this->posts()->latest()->take(5)->get();
但是我得到了 BadMethodCallException 方法 addEagerConstraints 不存在。
我什至尝试过这样的事情:
$genres = Genre::with('posts')->orderBy('name')->get();
$latest5PostsPerGenre = [];
foreach ($genres as $genre)
$genrePosts['posts'] = [];
$posts = $genre->posts()->orderBy('id', 'desc')->take(5)->get();
foreach ($posts as $post)
$singePost = [];
$singePost['id'] = $post->id;
$singePost['title'] = $post->title;
$singePost['bandName'] = $post->band->name;
array_push($genrePosts['posts'], $singePost);
array_push($latest5PostsPerGenre[$genre->name], $genrePosts);
或者像这样
$genres = Genre::get();
foreach ($genres as $genre)
$post[$genre->name] = $genre->posts()
->take(5)
->orderBy('id', 'desc')
->get();
但我知道它对 db 执行了很多查询并且不正确。
我尝试根据链接https://softonsofa.com/tweaking-eloquent-relations-how-to-get-n-related-models-per-parent/在Model.php中创建方法scopeNPerGroup,但它给出了一堆sql错误。
我正在考虑使用 Eloquent 进行一些复杂的嵌套 sql 查询,但不清楚如何编写。
因此,我希望每个流派名称都有 5 个最新帖子,其中包含每个帖子的 id、标题和乐队名称,以便在我的 Angular 前端(如 rnmblog.com)中为每个帖子编写链接/api/genre-slug/band-slug/post-id 或 post-slug 获取单个帖子。
【问题讨论】:
Categories 和 Genres 是不同的表吗? 修复了代码。该代码来自另一个 *** 页面。 【参考方案1】:对于我的主页,我想为每个类别显示 5 个最新帖子。
您的第一次尝试已经这样做了,不是吗?稍微改进了一下
$latest5PostsPerGenre = Genre::with([
'posts' => function($query)
$query->with('bands')
->take(5)
->orderBy('id', 'desc')
->get();
])
->orderBy('name')
->get();
【讨论】:
我们不能通过这种方式将每个类别的帖子限制为 5 个。我们所做的只是将整个查询限制为 5 个帖子。我收到这样的json:“id”:2,“name”:“alternative rock”,“slug”:“alternative-rock”,“posts”:[ “id”:399,“title”:“A explicabo voluptates在 sed nemo et.", "genre_id": 2 ] , "id": 3, "name": "hard rock", "slug": "hard-rock", "posts": [] , 为什么不能这样限制帖子?因为我认为您想在每个类别中显示“5 个帖子”,而这正是您的代码所做的。 嗯...我也是这么想的))但实际上并没有。我用邮递员测试过。现在我有 6 个流派 -> 它总共会给我 5*6=30 个帖子,但我收到:1 个流派 - 1 个帖子,2 个流派 - [ ],3 个流派 - 2 个帖子,4 个流派 - 2 个帖子,5流派 - [ ],6 流派 - [ ]。 softonsofa.com/… - 这里写了原因(第 4 和第 5 段)。我已经试过了。 您确定您的所有genres
每个都至少包含 5 个帖子吗?
当然,每个流派包含超过 50-60 个帖子。以上是关于如何为每种类型的 Laravel API 获取 5 个最新帖子?的主要内容,如果未能解决你的问题,请参考以下文章
如何为调用外部 API 的 Laravel Artisan 命令编写 PHPUnit 测试,而无需物理调用该 API?
如何为邮递员 API 请求编写 Laravel PHPUnit 测试