如何为每种类型的 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 测试

获取每种类型分组项目的有限项目 laravel

如何为 postgresql 数组数据类型创建 laravel 迁移

如何为每种产品风格提供不同的启动器图标

如何为 iPhone 6+、6 和 5 指定不同的尺寸?