【问题标题】:How to get 5 latest post for each genre Laravel API?如何为每种类型的 Laravel API 获取 5 个最新帖子?
【发布时间】: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 是不同的表吗?
  • 修复了代码。该代码来自另一个 stackoverflow 页面。

标签: php mysql angular laravel api


【解决方案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 个帖子。
猜你喜欢
  • 2016-12-25
  • 2014-07-19
  • 2011-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-24
相关资源
最近更新 更多