gpt4 book ai didi

php - 如何为每种类型的 Laravel API 获取 5 个最新帖子?

转载 作者:行者123 更新时间:2023-11-30 21:49:39 25 4
gpt4 key购买 nike

我正在使用 Laravel 5.4 作为 API 和 Angular 5 构建一个应用程序(我的类(class)项目)。我的项目是一个音乐博客。我需要满足要求,例如拥有类别和子类别

所以,我有流派、乐队和帖子。对于我的主页,我想为每个类别显示 5 个最新帖子

我的表格

  • 流派(id, name, slug);
  • 乐队(id, name, slug, genre_id);
  • 帖子(id、标题、内容、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();

在 Genre 模型中使用这样的方法:

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();

但我知道它对数据库执行了很多查询,这是不对的。


我试图根据链接 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} 获取单个帖子。

最佳答案

For my home page I want to display 5 latest posts for each category.

您的第一次尝试已经做到了,不是吗?稍微改进了一下

$latest5PostsPerGenre = Genre::with([ 
'posts' => function($query) {
$query->with('bands')
->take(5)
->orderBy('id', 'desc')
->get();
}])
->orderBy('name')
->get();

关于php - 如何为每种类型的 Laravel API 获取 5 个最新帖子?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47818154/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com