用关系回应JSON - Laravel / Eloquent

问题描述 投票:0回答:3

我正在开发一个Laravel项目,我想为网站创建一个REST API。在我的系统上,我有两个表:

博客和类别。表博客具有category_id列,该列是引用类别表中的列ID的键。

博客迁移

class CreateBlogsTable extends Migration
{
    public function up()
    {
     Schema::create('blogs', function (Blueprint $table) {
     $table->increments('id');
     $table->string('title');
     $table->longtext('body');
     $table->string('category_id');
     $table->timestamps();
    });
   }
   .....
}

分类迁移

class CreateCategoriesTable extends Migration
{
    public function up()
    {
     Schema::create('categories', function (Blueprint $table) {
     $table->increments('id');
     $table->string('name');
     $table->timestamps();
    });
   }
   ....
}

我的博客模特

class Blog extends Model
{
    protected $fillable = ['title', 'body', 'category_id'];
    public function category() {
       return $this->hasMany('app\Category');
    }
}

我的博客模特

class Category extends Model
{
    protected $fillable = ['name'];
    public function blog() {
       return $this->hasMany('app\Blog');
    }
}

因此,我创建了一个BlogController并配置了路由以访问相应的API函数。

api / blogs / via GET用于我的控制器的索引功能,该功能如下所示:

public function index()
{
    $blog = Blog::all();
    return response()->json($blog, 200);
}

有了这个,我可以从博客表中获取数据

[
    {
        "id": 1,
        "title": "title from my blog",
        "text": "text body here",
        "category_id": "2",
        "created_at": "2018-09-05 21:08:21",
        "updated_at": "2018-09-05 21:08:21"
    }
]

但我想合并博客和类别表,并得到类似的回应

[
    {
        "id": 1,
        "title": "title from my blog",
        "text": "text body here",
        "category_id": "2",
        "created_at": "2018-09-05 21:08:21",
        "updated_at": "2018-09-05 21:08:21"
        "category": [{
           "id": 2,
           "name": "Development"
        }]
    }
]

有人帮忙吗?

laravel rest api laravel-5 laravel-5.6
3个回答
0
投票

加载关系,它将包含在序列化响应中。

$blog = Blog::with('category')->get();

这个例子急于加载类别关系。

我建议你阅读雄辩的关系文档:https://laravel.com/docs/5.6/eloquent-relationships


0
投票

我得到了解决方案,我只需要说博客属于一个类别,一个类别可以有几个博客

class Blog extends Model
{
    protected $fillable = ['title', 'body', 'category_id',];
    public function category()
    {
        return $this->belongsTo('App\Category');
    }
}

分类模型

class Category extends Model
{
    protected $fillable = ['name'];
    public function blogs() {
        return $this->hasMany('App\Blog');
    }
}

所以列出具有类别详细信息的博客

public function index()
{
    $blogs = Blog::with('category')->get();
    return response()->json($blogs, 200);
}

所以要用你的博客列出类别

public function index()
{
    $categories = Category::with('blogs')->get();
    return response()->json($categories, 200);
}

0
投票

您在类别表中使用了没有参考ID的hasMany关系,因此数据不是急切加载的。如果您将迁移更改为

 class CreateCategoriesTable extends Migration
  {
     public function up()
     {
       Schema::create('categories', function (Blueprint $table) {
         $table->increments('id');
         $table->string('name');
         $table->timestamps();
         $table->integer('category_id');
      });
    }
   ....
  }

然后你可以使用

Blog::with('category')->get();

或者将关系改为

public function category(){
 return $this->belongsTo(Category::class);
}

并使用

Blog::with('category')->get();
© www.soinside.com 2019 - 2024. All rights reserved.