Inséré avec succès dans le tableau de l'auteur et du livre, mais impossible de l'insérer dans le tableau croisé dynamique. J'ai besoin d'insérer à partir du même formulaire dans les 3 tableaux. J'ai joint une capture d'écran de tout mon code. Veuillez aider.
Modèle de livre
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))
Modèle d'auteur
public function up()
{
Schema::create('author_book', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('author_id');
$table->unsignedBigInteger('book_id');
$table->timestamps();
});
}
3 Réponses :
Voici l'erreur dans la méthode de votre contrôleur de magasin:
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!');
}
Ici, vous créez une nouvelle instance de Author , sans utiliser l'objet auteur nouvellement créé. C'est pourquoi lance une erreur: la nouvelle instance n'a pas encore d'identifiant (parce qu'elle existe juste en mémoire, elle n'est pas encore persistante).
Mettez à jour le code comme ceci:
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!');
}
Le problème est dans le magasin de méthodes BookController car utilisez une nouvelle instance du modèle Author qui n'existe pas dans la base de données et qu'il s'agit simplement d'une instance du modèle Author, donc changez la méthode du magasin comme suit:
$book = Book::create($this->validateBookInputs());
$author = Author::create($this->validateAuthorInputs());
$author->books()->attach($book->id);
return back()->with('status', 'Insert Successful!');
p >
Vous pouvez éviter de joindre une étape et passer de 3 à deux étapes
$book = Book::create($this->validateBookInputs()); $author = $book->authors()->create($this->validateAuthorInputs())
L'auteur_id est-il l'utilisateur autorisé actuel?