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

标签 php mysql angular laravel api

我正在使用 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/

相关文章:

php - 通过 codeigniter 将帖子数据作为数组从数据库中的网格插入?

angular - TypeError : _co. class.function 不是函数

javascript - 为什么我的字符串的一部分被省略了?

php - 如何在mysql中获取0-30天记录,30-60和60 -90及90以上

php - 如何屏蔽用户?

php - Eloquent ORM 返回带有单个项目的集合

mysql - ActiveRecord 关联 : am I doing it right?

mysql - 如何在 Latin1 编码列中检测 UTF-8 字符 - MySQL

php - 我可以验证 php session 哈希使用的是什么算法吗?

javascript - Angular 6 多场滤镜