Привет, я новичок и немного борюсь за понимание того, как создавать отношения. Я пытаюсь сделать базовый успокоительный API в Laravel и у меня есть 3 модели
class Book extends Model {
public function author()
{
return $this->belongsTo(Author::class);
}
public function categories()
{
return $this->belongsToMany('App\Category', 'category_book')
->withTimestamps();
}
}
class Author extends Model
{
public function books(){
return $this->hasMany(Book::class);
}
}
class Category extends Model
{
public function books()
{
return $this->belongsToMany('App\Book', 'category_book')
->withTimestamps();
}
}
Миграции таблиц:
Schema::create('books', function (Blueprint $table) {
$table->engine = "InnoDB";
$table->increments('id');
$table->string('ISBN', 32);
$table->string('title');
$table->integer('author_id')->unsigned();
$table->float('price')->default(0);
$table->timestamps();
});
Schema::create('authors', function (Blueprint $table) {
$table->engine = "InnoDB";
$table->bigIncrements('id');
$table->string('name');
$table->string('surname');
$table->timestamps();
});
Schema::create('categories', function (Blueprint $table) {
$table->engine = "InnoDB";
$table->bigIncrements('id');
$table->string('name');
$table->timestamps();
});
Schema::create('category_book', function (Blueprint $table) {
$table->bigIncrements('id');
$table->integer('category_id')->unsigned();
//$table->foreign('category_id')->references('id')->on('categories')->onDelete('cascade');
$table->integer('book_id')->unsigned();
//$table->foreign('book_id')->references('id')->on('books')->onDelete('cascade');
$table->timestamps();
});
Книги - это основная таблица, и автор имеет множество связей с книгами. Категория имеет много-много связей с книгами, так как книга может быть в нескольких категориях.
В таблице книг есть поле author_id, чтобы связать его с таблицей авторов. Существует также сводная таблица category_books, которая содержит category_id и book_id для связи книг с категориями.
Скажем, я хочу создать новую запись книги, и если автор существует, чтобы связать книгу с этим автором, но если он не существует, я хочу создать новую запись автора, а затем связать книгу с этим автором?
Я бы тоже хотел сделать то же самое с категориями
В моем контроллере книг есть следующее:
public function store(Request $request)
{
$book = new book;
$book->title = $request->title;
$book->ISBN = $request->ISBN;
$book->price = $request->price;
$book->categories()->associate($request->category);
$book->save();
return response()->json($book, 201);
}