初めまして。今年の4月に新卒採用で入社した比嘉(ひが)です。
名前でピンときた方もおられるかもしれませんが、沖縄の出身…ではありません。
(沖縄の名字ランキングで比嘉は大概1位なのです)
父親は沖縄の出身ですが、私自身は当社がある兵庫県出身です。
では兵庫県育ちなのかといえばそれも微妙な所で、現時点で人生の4割を兵庫県、
残りの6割を沖縄県で過ごすという経歴になっています。
沖縄で高校・大学共に情報系の学部を卒業しました。
高校は極普通の情報科、大学はマイコン・回路設計(CAD・エッチング)、
サーバ・ネットワーク構築などを勉強していました。
趣味はゲームとアニメです…が、毎日アニメを見たりゲームをしている訳ではなく、
評判の良いアニメやゲームがあれば楽しむというスタンスなので、
個人的には、村上春樹は新作が出たら読みます!
と言っている人とあまり変わらないのではないかと思っています。
あとは漫画を読んだりピアノを弾いたりバドミントンをしたり卓球をしたり、
自転車やバイクで遠くに出かけてみたりケーキ屋を巡ってみたり…
とりあえず楽しそうなことには積極的に手を出してみることにしています。
PHPフレームワークLalavelの機能紹介
さて、入社してから約2.5ヶ月が経過した現在、
私は「Laravel」というPHPフレームワークを使ったWebシステムを開発しています。
この「Laravel」は2012年に開発された比較的新しいフレームワークで、
最近世界中で人気が急上昇しているそうです。
最近のフレームワークには大概、DBを利用する際にSQL文を直接記述することなく、
DBを仮想的にオブジェクトとして扱う(O/Rマッピング)機能が備わっています。
LaravelにもEloquent ORMという機能があり、絶賛利用中なのですが、
そのEloquent ORMの機能の一つ「Eagerローディング」を紹介したいと思います。
(Eagerローディング自体はEloquent ORM独自の機能ではありません)
Eagerローディング機能は、N+1問題を解決するためにあります。
N+1問題とは、全てのデータを取得しそのデータから個別のデータを取得する際などに起こる、
データの件数分(N)+全てのデータを取得(1)という処理が発生してしまう問題のことです。
データの件数が少ない場合はあまり問題にならないこともありますが、
仮に100万件のデータに対してこの処理を行うと、100万1回のクエリが実行されてしまうので、
アプリケーションのパフォーマンスに影響を与えてしまいます。
Eagerローディング機能を利用し、先に取得するデータ(個別のデータ)を指定することで、
実行されるクエリの数を減らすことができます。
具体的な使い方として、例えば社員にはそれぞれ担当顧客がおり、
社員の名前と担当顧客の名前を取得したいとします。

社員の名前と顧客の名前を全社員分取得する場合、
1 2 3 4 5 |
foreach (Employee::all() as $employee) { $employee_name = $employee->name // 社員の名前 $customer_name = $employee->customer->name // 顧客の名前 } |
1 2 3 4 |
select * from `employees` select `name` from `customers` where `customers`.`employees_id` = 1 select `name` from `customers` where `customers`.`employees_id` = 2 select `name` from `customers` where `customers`.`employees_id` = 3 |
このようなコードを書くと、N+1問題が起こってしまいます。
そこで、Eagerローディング機能を使い、顧客データの取得を先に指定することで、
1 2 3 4 5 |
foreach (Employee::with('customer')->get() as $employee) { $name = $employee->name; // 社員の名前 $customer = $employee->customer // 顧客の名前 } |
1 2 |
select * from `employees` select * from `customers` where `customers`.`employees_id` in (1, 2, 3) |
IN句によってSQLのWHEREを一つにまとめてくれるので、
社員が何名存在していても、クエリの実行回数を2回に減らすことができます。
N+1問題が起きそうな場面があれば、
Eagerローディングなどの対策を考える必要があるかもしれません。