我正在开发一个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"
}]
}
]
有人帮忙吗?
加载关系,它将包含在序列化响应中。
$blog = Blog::with('category')->get();
这个例子急于加载类别关系。
我建议你阅读雄辩的关系文档:https://laravel.com/docs/5.6/eloquent-relationships
我得到了解决方案,我只需要说博客属于一个类别,一个类别可以有几个博客
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);
}
您在类别表中使用了没有参考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();