Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Laravelでタグ機能を作ってちょっとハマった話
Search
fortkle
July 18, 2015
Programming
3.9k
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Laravelでタグ機能を作ってちょっとハマった話
Laravel Meetup Tokyo Vol.7
fortkle
July 18, 2015
More Decks by fortkle
See All by fortkle
無駄な物をなるべく作らないリプレイス戦略 / replace-strategy-phperkaigi2021
fortkle
1
2.7k
フルリモート時代のカンバン運用 / kanban-operation-in-remote
fortkle
0
800
GitHub Actionsで始めるPHPアプリケーションのCI実践入門 / ga-phperkaigi2020
fortkle
3
7.2k
余裕を生み出すコードレビュー 〜レビュイー編〜 / code-review-phpcon-2019
fortkle
8
7.6k
「設計振り返り」を始めてみようと思っている話 / architecture reflection
fortkle
3
650
「ママ向けNo.1アプリ」の 更なる成長を支える仕組み / startup-engineer-night-connehito
fortkle
2
370
良いテストデータ、悪いテストデータ / testdata-antipattern
fortkle
4
7k
BackstopJSで始める CSSリグレッションテスト / backstopjs-css-test
fortkle
0
1.6k
PhpStorm導入アンチパターン / phpstorm-anti-pattern
fortkle
0
2.2k
Other Decks in Programming
See All in Programming
contenteditable と日本語入力に向き合う
colorful12
0
200
残高管理から台帳サービスへの進化
artoy
1
200
ActionController meets Protocol Buffers
sorah
0
560
C#の現在地 進化の歴史と、AI時代の.NET Everywhere
neuecc
5
5.2k
コードで差別化できない時代の ソフトウェアエンジニアリング / Software Engineering in an Era Where Code Doesn’t Differentiate
kishida
2
180
【加筆修正版】Laravel のアプリケーションをどこにデプロイするか #phpcon_ehime
akase244
0
150
Domain-Driven Transformation
hschwentner
2
2.3k
動作中のプログラムの中身をリアルタイムに覗く / Realtime Debugger for CSharp with Roslyn
prota
1
1.9k
作れる、でも消せるか?──安全に「枯らして消す」機能削除術 / Drain, Then Delete
chobishiba
2
790
Railsバージョンを4倍にした話
optim
0
450
KiroのSpecで「五目並べ」を作ってみる
satoshi256kbyte
1
380
APNsからLive Activityを開始する話
yumnumm
0
170
Featured
See All Featured
Side Projects
sachag
456
43k
Designing for Timeless Needs
cassininazir
1
530
A Modern Web Designer's Workflow
chriscoyier
699
190k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.2k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
850
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.4k
Fantastic passwords and where to find them - at NoRuKo
philnash
53
4k
Bootstrapping a Software Product
garrettdimon
PRO
306
120k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
410
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
730
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.6k
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()がグー便利。
ご静聴ありがとうございました