многие ко многим вставляют из одного метода формы / контроллера во все три таблицы - author, book & author_book in laravel - PullRequest
0 голосов
/ 14 февраля 2020

Успешно вставлен в таблицу авторов и книг, но не может быть вставлен в сводную таблицу. Мне нужно вставить из одной и той же формы во все 3 таблицы. Я приложил скриншот всего моего кода. Просьба помочь.

Модель книги

class Book extends Model
{
  protected $guarded = [];

  public function authors(){
    return $this->belongsToMany('App\Models\Author');
  }
}

Автор Модель

class Author extends Model
{
  public $guarded = [];

  public function books(){
    return $this->belongsToMany('App\Models\Book');
  }
 }

Контроллер книги

public function store(Request $request)
{
    Book::create($this->validateBookInputs());
    Author::create($this->validateAuthorInputs());

    $book_id=Book::latest()->first()->id;
    // $author_id=Author::latest()->first()->id;

    // $book = new Book();
    // $book->authors()->attach($author_id);

    $author = new Author();
    $author->books()->attach($book_id);
    return back()->with('status', 'Insert Successful!');
}

public function validateBookInputs(){
    return request()->validate([
        'book_name' => 'required'
    ]);
}
public function validateAuthorInputs(){
    return request()->validate([
        'author_name' => 'required'
    ]);
}

Создание книги - просмотр

<form action="/books" method="POST">
<div class="form-group">
    <label>Enter Book Name</label>
    <input type="text" name="book_name" placeholder="Book Name" value="{{old('book_name')}}" class="form-control">
</div>
<div class="form-group">
    <label>Enter Author Name</label>
    <input type="text" name="author_name" placeholder="Author Name" value="{{old('author_name')}}"
        class="form-control">
</div>

<button type="submit" class="button-green">Submit</button>
@csrf

создание таблицы авторов

public function up()
{
    Schema::create('authors', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('author_name', '30');
        $table->timestamps();
    });
}

создать таблицу книг

public function up()
{
    Schema::create('books', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('book_name', '30');
        $table->timestamps();
    });
}

создать таблицу author_book

public function up()
{
    Schema::create('author_book', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->unsignedBigInteger('author_id');
        $table->unsignedBigInteger('book_id');
        $table->timestamps();
    });
}

Ошибка

Illuminate\Database\QueryException
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'author_id' cannot be null (SQL: insert into `author_book` (`author_id`, `book_id`) values (?, 25))

Ответы [ 3 ]

0 голосов
/ 14 февраля 2020

проблема в хранилище методов BookController, потому что используется новый экземпляр модели Author, который не существует в базе данных, а просто является экземпляром модели Author, поэтому измените метод хранилища следующим образом:

$book = Book::create($this->validateBookInputs());
$author = Author::create($this->validateAuthorInputs());

$author->books()->attach($book->id);
return back()->with('status', 'Insert Successful!');
0 голосов
/ 15 февраля 2020

Вы можете избежать добавления шага и go от 3 до двух шагов

$book = Book::create($this->validateBookInputs());
$author = $book->authors()->create($this->validateAuthorInputs())
0 голосов
/ 14 февраля 2020

Вот ошибка в вашем методе хранилища контроллеров:

public function store(Request $request)
{
    Book::create($this->validateBookInputs());
    Author::create($this->validateAuthorInputs());

    $book_id=Book::latest()->first()->id;

    $author = new Author(); // <----
//  ^^^^^^^^^^^^^^^^^^^^^^^    
    $author->books()->attach($book_id);

    return back()->with('status', 'Insert Successful!');
}

Здесь вы создаете новый экземпляр Author, не используя вновь созданный объект author. Вот почему выдает ошибку: у нового экземпляра еще нет идентификатора (поскольку он просто существует в памяти, он еще не сохранен).

Обновите код следующим образом:

public function store(Request $request)
{
    $book = Book::create($this->validateBookInputs());
//  ^^^^^^^  
    $author = Author::create($this->validateAuthorInputs());
//  ^^^^^^^ 

    $author->books()->attach($book->id); // <---
//  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    return back()->with('status', 'Insert Successful!');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...