tagテーブルに新規追加で登録できるようにしたいです。
最初にbookテーブルと一緒に登録できるのですが、追加コマンドから新しくデータを挿入するときに過去のタグ名前が上書きされてしまいます。
原因はforeachで囲ってないために最後のデータを上書きしてしまうことはわかっているのですが、ここからの実装ができずにいます。
$data["book_id"]でデバックするとその指定のbook_idが一覧で取れます。
array_search array_coulmnで一致させればと思っております。
ですがどうしてもできなかったので質問させていただきます。
よろしくお願いします。
tag controller public function store(Request $request,Book $book, Tag $tag) { $user = auth()->user(); $data = $request->all(); $books = $book->all(); //ここを実装したいです。 foreach($books as $book) $book_ids = $book->id; var_dump($book_ids); #カテゴリ名の重複登録を防ぐ $storedTagNames = $tag->whereIn('name',$data["tags"])->pluck('name'); $newTagNames = array_diff($data["tags"],$storedTagNames->all()); //タグ挿入 $tag->tagStore($newTagNames); //$tagテーブルに挿入した値の名前からidを取得し中間テーブルへ $tag_ids = $tag->getTagIds($data["tags"]); //中間テーブルにidを設置 $book->bookTagSync($tag_ids); return redirect()->route('books.show', $book['id']); }
book model public function bookTagSync(Array $tag_ids){ //syncメソッドは中間テーブルに設置しておくIDの配列を渡す。https://yshrfmru.hatenablog.com/entry/2019/03/24/131219 $this->tags()->sync($tag_ids); }
tag model public function tagStore(Array $_tag_names){ //タグがすでにあるかの判定 if(!empty($_tag_names)){ //タグがあるかforeachで探す.['name' => $tag_name] foreach($_tag_names as $tag_name){ $tag_names[] = ['name' => $tag_name]; } //insertOrIgnoreであれば無視、なければ挿入 DB::table('tags') ->insertOrIgnore($tag_names); } } public function getTagIds($tag_names){ foreach($tag_names as $tag_name){ //idから名前を1から取り出して$tag_idに代入 $tag_id = $this::select('id')->where("name",$tag_name)->first(); //$tag_idのidを配列$tag_ids[]に全て代入 $tag_ids[] = $tag_id->id; } return $tag_ids; }