Ответы JSON с отношениями - Laravel / Eloquent - PullRequest
0 голосов
/ 06 сентября 2018

Я работаю над проектом Laravel и хочу создать REST API для веб-сайта. В моей системе у меня есть две таблицы:

Блоги и Категории. В блогах таблицы есть столбец category_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"
        }]
    }
]

кому помочь?

Ответы [ 3 ]

0 голосов
/ 06 сентября 2018

Я получил решение, мне просто нужно было сказать, что блог принадлежит категории, а в категории может быть несколько блогов

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 голосов
/ 07 сентября 2018

Вы используете отношение 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();
0 голосов
/ 06 сентября 2018

Загрузите отношение, и оно будет включено в сериализованный ответ.

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

Этот пример пытается загрузить отношение категории.

Я предлагаю вам прочитать документы красноречивых отношений: https://laravel.com/docs/5.6/eloquent-relationships

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...