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

ご静聴ありがとうございました