0
votes

plusieurs à plusieurs insérer d'un formulaire / méthode de contrôleur aux trois tables - auteur, livre et auteur_book dans laravel

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();
    });
}


1 commentaires

L'auteur_id est-il l'utilisateur autorisé actuel?


3 Réponses :


1
votes

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!');
}


0 commentaires

1
votes

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 >


0 commentaires

1
votes

Vous pouvez éviter de joindre une étape et passer de 3 à deux étapes

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


0 commentaires