Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Laravelでタグ機能を作ってちょっとハマった話

F4d37a67ce86b2f962c79d73a9127d3c?s=47 fortkle
July 18, 2015

 Laravelでタグ機能を作ってちょっとハマった話

Laravel Meetup Tokyo Vol.7

F4d37a67ce86b2f962c79d73a9127d3c?s=128

fortkle

July 18, 2015
Tweet

Transcript

  1. Laravelでタグ機能を作って ちょっとハマった話 Laravel Meetup Tokyo Vol.7 @fortkle

  2. 自己紹介 •  高野福晃 – Istyle, inc.   開発基盤改善チーム – Twitter: @fortkle – Github:

    fortkle
  3. アジェンダ 1.  タグ機能の仕様 2.  attach()の罠 3.  sync()がグー便利

  4. 1.タグ機能の仕様

  5. タグ機能を作ってみる •  趣味で作っている情報共有ツール –  https://github.com/fortkle/owl •  利用者は記事を投稿することができる •  記事に対してタグを付けたい!

  6. タグ機能のテーブル設計 •  調べてみると幾つかのやり方が見つかった •  下記の記事に詳しく載っているので参考にした

  7. タグ機能のテーブル設計 •  今回は「Toxi法」という設計を採用 •  Toxi法は3つのテーブルから成る •  中間の「tagmap」テーブルでbookmarkテーブルとtag テーブルが関連付けられ、bookmarkデータとtagデー タは多対多の関係になる。

  8. Laravelでのリレーション •  今回はEloquentを使う •  記事をitemsテーブル、タグをtagsテーブルとする •  中間テーブルとしてitem_tagテーブルを作る •  記事とタグは多対多の関係なので下記のように定義

  9. 2.attach()の罠

  10. 多対多の関連の操作 •  LaravelでEloquentを使っている場合、簡単に多対多 の関連を操作することができる •  例えば、ID=1の記事に、ID=1と2のタグを単純に追加 する場合、attachメソッドを使う •  attach()にはID(配列でもOK)を渡してあげる $tag_ids

    = [1,2]だとする。
  11. 多対多の関連の操作 •  期待通りになっている!

  12. 多対多の関連の操作 •  …と思ってタイトルを少し変えて更新してみたら •  同じデータがitem_tagテーブルにinsertされてるー! •  attachメソッドは存在チェックをせずに問答無用で insertしてくる!

  13. 3.sync()がグー便利

  14. 多対多の関連の操作 •  attach()の他に、多対多のモデルを削除するdetach() がある •  さらに、attach()とdetach()の機能を併せ持ち、存在 チェックまで良しなにしてくれるsync()がある! •  sync()を実行すると、そのモデルに対する中間テーブ ルは配列で指定されたIDだけになる!

    $tag_ids = [1,2]だとする。
  15. 多対多の関連の操作 •  一度item_tagテーブルのレコードを削除して、記事の 登録・更新をやってみると •  今度は正しく更新されました!

  16. まとめ •  Eloquentだとさくっとモデルのリレーションが定義で きて楽ちん。 •  sync()がグー便利。

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