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.7k
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.3k
フルリモート時代のカンバン運用 / kanban-operation-in-remote
fortkle
0
680
GitHub Actionsで始めるPHPアプリケーションのCI実践入門 / ga-phperkaigi2020
fortkle
3
4.4k
余裕を生み出すコードレビュー 〜レビュイー編〜 / code-review-phpcon-2019
fortkle
8
7.2k
「設計振り返り」を始めてみようと思っている話 / architecture reflection
fortkle
3
560
「ママ向けNo.1アプリ」の 更なる成長を支える仕組み / startup-engineer-night-connehito
fortkle
2
310
良いテストデータ、悪いテストデータ / testdata-antipattern
fortkle
4
6.8k
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
Javaに鉄道指向プログラミング (Railway Oriented Pro gramming) のエッセンスを取り入れる/Bringing the Essence of Railway-Oriented Programming to Java
cocet33000
2
580
アンドパッドの Go 勉強会「 gopher 会」とその内容の紹介
andpad
0
250
Enterprise Web App. Development (2): Version Control Tool Training Ver. 5.1
knakagawa
1
120
事業戦略を理解してソフトウェアを設計する
masuda220
PRO
22
6.2k
Datadog RUM 本番導入までの道
shinter61
1
310
プロダクト開発でも使おう 関数のオーバーロード
yoiwamoto
0
160
CursorはMCPを使った方が良いぞ
taigakono
0
140
生成AIで日々のエラー調査を進めたい
yuyaabo
0
620
なぜ適用するか、移行して理解するClean Architecture 〜構造を超えて設計を継承する〜 / Why Apply, Migrate and Understand Clean Architecture - Inherit Design Beyond Structure
seike460
PRO
0
250
DroidKnights 2025 - 다양한 스크롤 뷰에서의 영상 재생
gaeun5744
3
300
都市をデータで見るってこういうこと PLATEAU属性情報入門
nokonoko1203
1
550
地方に住むエンジニアの残酷な現実とキャリア論
ichimichi
2
620
Featured
See All Featured
Embracing the Ebb and Flow
colly
86
4.7k
Build The Right Thing And Hit Your Dates
maggiecrowley
36
2.8k
Adopting Sorbet at Scale
ufuk
77
9.4k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
GitHub's CSS Performance
jonrohan
1031
460k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
657
60k
Why You Should Never Use an ORM
jnunemaker
PRO
56
9.4k
Art, The Web, and Tiny UX
lynnandtonic
299
21k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
8
790
What's in a price? How to price your products and services
michaelherold
245
12k
Visualization
eitanlees
146
16k
Code Review Best Practice
trishagee
68
18k
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()がグー便利。
ご静聴ありがとうございました