Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
Laravelでタグ機能を作って ちょっとハマった話 Laravel Meetup Tokyo Vol.7 @fortkle
Slide 2
Slide 2 text
自己紹介 • 高野福晃 – Istyle, inc. 開発基盤改善チーム – Twitter: @fortkle – Github: fortkle
Slide 3
Slide 3 text
アジェンダ 1. タグ機能の仕様 2. attach()の罠 3. sync()がグー便利
Slide 4
Slide 4 text
1.タグ機能の仕様
Slide 5
Slide 5 text
タグ機能を作ってみる • 趣味で作っている情報共有ツール – https://github.com/fortkle/owl • 利用者は記事を投稿することができる • 記事に対してタグを付けたい!
Slide 6
Slide 6 text
タグ機能のテーブル設計 • 調べてみると幾つかのやり方が見つかった • 下記の記事に詳しく載っているので参考にした
Slide 7
Slide 7 text
タグ機能のテーブル設計 • 今回は「Toxi法」という設計を採用 • Toxi法は3つのテーブルから成る • 中間の「tagmap」テーブルでbookmarkテーブルとtag テーブルが関連付けられ、bookmarkデータとtagデー タは多対多の関係になる。
Slide 8
Slide 8 text
Laravelでのリレーション • 今回はEloquentを使う • 記事をitemsテーブル、タグをtagsテーブルとする • 中間テーブルとしてitem_tagテーブルを作る • 記事とタグは多対多の関係なので下記のように定義
Slide 9
Slide 9 text
2.attach()の罠
Slide 10
Slide 10 text
多対多の関連の操作 • LaravelでEloquentを使っている場合、簡単に多対多 の関連を操作することができる • 例えば、ID=1の記事に、ID=1と2のタグを単純に追加 する場合、attachメソッドを使う • attach()にはID(配列でもOK)を渡してあげる $tag_ids = [1,2]だとする。
Slide 11
Slide 11 text
多対多の関連の操作 • 期待通りになっている!
Slide 12
Slide 12 text
多対多の関連の操作 • …と思ってタイトルを少し変えて更新してみたら • 同じデータがitem_tagテーブルにinsertされてるー! • attachメソッドは存在チェックをせずに問答無用で insertしてくる!
Slide 13
Slide 13 text
3.sync()がグー便利
Slide 14
Slide 14 text
多対多の関連の操作 • attach()の他に、多対多のモデルを削除するdetach() がある • さらに、attach()とdetach()の機能を併せ持ち、存在 チェックまで良しなにしてくれるsync()がある! • sync()を実行すると、そのモデルに対する中間テーブ ルは配列で指定されたIDだけになる! $tag_ids = [1,2]だとする。
Slide 15
Slide 15 text
多対多の関連の操作 • 一度item_tagテーブルのレコードを削除して、記事の 登録・更新をやってみると • 今度は正しく更新されました!
Slide 16
Slide 16 text
まとめ • Eloquentだとさくっとモデルのリレーションが定義で きて楽ちん。 • sync()がグー便利。
Slide 17
Slide 17 text
ご静聴ありがとうございました