Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Laravelでタグ機能を作ってちょっとハマった話
Search
fortkle
July 18, 2015
Programming
3
3.8k
Laravelでタグ機能を作ってちょっとハマった話
Laravel Meetup Tokyo Vol.7
fortkle
July 18, 2015
Tweet
Share
More Decks by fortkle
See All by fortkle
無駄な物をなるべく作らないリプレイス戦略 / replace-strategy-phperkaigi2021
fortkle
1
2.4k
フルリモート時代のカンバン運用 / kanban-operation-in-remote
fortkle
0
710
GitHub Actionsで始めるPHPアプリケーションのCI実践入門 / ga-phperkaigi2020
fortkle
3
4.6k
余裕を生み出すコードレビュー 〜レビュイー編〜 / code-review-phpcon-2019
fortkle
8
7.3k
「設計振り返り」を始めてみようと思っている話 / architecture reflection
fortkle
3
580
「ママ向けNo.1アプリ」の 更なる成長を支える仕組み / startup-engineer-night-connehito
fortkle
2
320
良いテストデータ、悪いテストデータ / testdata-antipattern
fortkle
4
6.9k
BackstopJSで始める CSSリグレッションテスト / backstopjs-css-test
fortkle
0
1.5k
PhpStorm導入アンチパターン / phpstorm-anti-pattern
fortkle
0
2.1k
Other Decks in Programming
See All in Programming
関数の挙動書き換える
takatofukui
4
750
JJUG CCC 2025 Fall: Virtual Thread Deep Dive
ternbusty
3
480
Honoを技術選定したAI要件定義プラットフォームAcsimでの意思決定
codenote
0
260
ゼロダウンタイムでミドルウェアの バージョンアップを実現した手法と課題
wind111
0
210
「AWS CDK入門」の前日譚/Prequelto-Introduction-To-AWSCDK
tyumugi1113
0
100
AI時代もSEOを頑張っている話
shirahama_x
0
160
Claude Code on the Web を超える!? Codex Cloud の実践テク5選
sunagaku
0
600
TypeScript 5.9で使えるようになった import defer でパフォーマンス最適化を実現する
bicstone
1
380
AWS CDKの推しポイントN選
akihisaikeda
1
160
r2-image-worker
yusukebe
1
180
AIを駆使して新しい技術を効率的に理解する方法
nogu66
1
660
Atomics APIを知る / Understanding Atomics API
ssssota
1
200
Featured
See All Featured
Navigating Team Friction
lara
190
16k
The Pragmatic Product Professional
lauravandoore
36
7k
Designing for humans not robots
tammielis
254
26k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
359
30k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
How GitHub (no longer) Works
holman
315
140k
Done Done
chrislema
186
16k
The World Runs on Bad Software
bkeepers
PRO
72
12k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
11
940
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.5k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
1.8k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.5k
Transcript
Laravelでタグ機能を作って ちょっとハマった話 Laravel Meetup Tokyo Vol.7 @fortkle
自己紹介 • 高野福晃 – Istyle, inc. 開発基盤改善チーム – Twitter: @fortkle – Github:
fortkle
アジェンダ 1. タグ機能の仕様 2. attach()の罠 3. sync()がグー便利
1.タグ機能の仕様
タグ機能を作ってみる • 趣味で作っている情報共有ツール – https://github.com/fortkle/owl • 利用者は記事を投稿することができる • 記事に対してタグを付けたい!
タグ機能のテーブル設計 • 調べてみると幾つかのやり方が見つかった • 下記の記事に詳しく載っているので参考にした
タグ機能のテーブル設計 • 今回は「Toxi法」という設計を採用 • Toxi法は3つのテーブルから成る • 中間の「tagmap」テーブルでbookmarkテーブルとtag テーブルが関連付けられ、bookmarkデータとtagデー タは多対多の関係になる。
Laravelでのリレーション • 今回はEloquentを使う • 記事をitemsテーブル、タグをtagsテーブルとする • 中間テーブルとしてitem_tagテーブルを作る • 記事とタグは多対多の関係なので下記のように定義
2.attach()の罠
多対多の関連の操作 • LaravelでEloquentを使っている場合、簡単に多対多 の関連を操作することができる • 例えば、ID=1の記事に、ID=1と2のタグを単純に追加 する場合、attachメソッドを使う • attach()にはID(配列でもOK)を渡してあげる $tag_ids
= [1,2]だとする。
多対多の関連の操作 • 期待通りになっている!
多対多の関連の操作 • …と思ってタイトルを少し変えて更新してみたら • 同じデータがitem_tagテーブルにinsertされてるー! • attachメソッドは存在チェックをせずに問答無用で insertしてくる!
3.sync()がグー便利
多対多の関連の操作 • attach()の他に、多対多のモデルを削除するdetach() がある • さらに、attach()とdetach()の機能を併せ持ち、存在 チェックまで良しなにしてくれるsync()がある! • sync()を実行すると、そのモデルに対する中間テーブ ルは配列で指定されたIDだけになる!
$tag_ids = [1,2]だとする。
多対多の関連の操作 • 一度item_tagテーブルのレコードを削除して、記事の 登録・更新をやってみると • 今度は正しく更新されました!
まとめ • Eloquentだとさくっとモデルのリレーションが定義で きて楽ちん。 • sync()がグー便利。
ご静聴ありがとうございました