2017-12-05 19 views
1

私はライブラリの管理パネルを開発しています。私はより多くの著者と一緒に本を挿入する必要があります。私は私のコントローラーにブックを挿入するかどうかはわかりませんが、私はBooksControllerのテーブル "著者"に著者のiを挿入する方法を理解していません。たす。 BooksControllerの Thathコード:"Many to Many"のデータを挿入

public function insert(Request $request) 
{ 
    $BookName = $request->input('bookname'); 
    if(!empty($BookName)){ 
     $NewBook = new Books; 
     $NewBook->name = $BookName; 
     $BookFile = $request->file('books_file'); 
     if(!empty($BookFile)){ 
      $NewBook->img = $BookFile->getClientOriginalName(); 
      $BookFile->move(storage_path('images/books/'), $BookFile->getClientOriginalName()); 
     } 
     $NewBook->save(); 

     $AuthorsNames = $request->input('authors'); 
     if(!empty($AuthorsNames)){ 
      $AuthorsFiles = $request->file('authfiles'); 


     } 
     return "Scs"; 
    }else{ 
     return 'Enter book title'; 
    } 
} 

私は必要な機能に関するドキュメントを読んで、私はそれらを使用する方法を理解していませんでした。私のコードでは、1冊の本が多くの著者を持つことができるので、私は一連の著者を受け入れます。私はコードのためではなく、必要な機能とその使用法の説明に非常に感謝します。

答えて

2

Laravelドキュメントで詳細に説明しています。

雄弁の取り外し/取り付け

https://laravel.com/docs/5.5/eloquent-relationships#updating-many-to-many-relationships

は、関連するモデルでの作業をより便利にするためにいくつかの追加のヘルパーメソッドを提供します。たとえば、ユーザーが多数の役割を持ち、役割が多数のユーザーを持つことができるとします。 、モデルを結合中間テーブルにレコードを挿入することによって、ユーザーに役割を添付添付する方法を使用するには、次のモデルとの関係を取り付けるとき

$user = App\User::find(1); 

$user->roles()->attach($roleId); 

、あなたはまたに追加データの配列を渡すこと中間テーブルに挿入すること:あなたの例では


、著者は、すでに多くの関係に多くの人があなたの本テーブルのブック、authorsテーブルでの著者、そして両方の主キーを持っていることを意味しているため存在している必要があります(id)が中間テーブルにリンクされています。

著者がまだ存在しない場合は、著者を保存してidを取得し、attachを使用してidをブックに追加します。ブックモデルは著者名を気にするべきではなく、IDだけを気にするべきです。


著者と書籍はリンクするまで完全に分離していると考えるべきです。したがって、書籍は別々に作成し、著者は別々に作成してリンクする必要があります。言い換えると、BookControllerから作成者を作成してはいけませんが、作成者モデルを$author = Author::create($data)のように作成してください。$book->authors()->attach($author->id)

大きな問題あなたの構造を参照してくださいどのように著者が既に存在するかどうかを知っていますか? 2人の異なる著者が同じ名前を共有する可能性があります。理想的には、名前ではなくBookControllerにIDを渡すことをお勧めします。

+0

私は今の機能については、 "添付"。 BooksControllerのテーブル作成者に新しい著者を挿入することはできません。しかし、私が使ったドキュメントのすべての機能は使えましたが、すべての試みは間違いでした。私の質問は次のとおりです。ドキュメントの例を理解できないので、例文を挿入してください。例文をお願いします.Aloquent関数を使用してください。 – NONAME

+0

@NONAMEどのようなエラーが発生しますか? – DrStein

+0

私が上で言ったように、 "著者はすでに存在すべきです"。私の追加情報を読む... – Devon

1

基本的には、ブックテーブルの横に2つの他のテーブルが必要です.1つは作成者用のモデルクラスを作成する必要がある作成者テーブルであり、作成者テーブルを追加することができます。ピボットテーブルのauthors_booksは、多対多の関係であるためです。

Author::create(['name' => $name,....]); 

Schema::create('authors_books', function (Blueprint $table) { 
     $table->increments('id'); 
     $table->integer('author_id')->unsigned(); 
     $table->integer('book_id')->unsigned(); 
     $table->foreign('author_id')->references('id')->on('authors')->onDelete('cascade'); 
     $table->foreign('book_id')->references('id')->on('books')->onDelete('cascade'); 
     $table->timestamps(); 
    }); 

そして、あなたは、ピボットテーブルに追加することができます。

DB::table('authors_books')->insert(
      ['author_id' => $author, 'book_id' => $book_id] 
     );