2019.1.13
団体用集金システムを作りたい!#20【Eagerロード】
忘備録として。
メンバー管理モジュールは作るの簡単でしょ!wとか思ってたんですが、思ったより難航してて、あと
「管理者」は自分自身の「管理者権限」を外すことができないという仕様のことを完全に忘れてた・・・・・・笑
それとはちょっと関係ない話なのですが、普通にテーブルをjoinしていると避けられない問題が発生したのでいまロジックを組み直してる箇所があるんですが、その中でEagerロードを導入することを迫られたので、いろいろごにょごにょやってたのでそのメモをします。
まず、この記事を書いてる段階で成功した多対1のリレーションのEagerロードですね。まずは実際のコードをどん。
$items = Belong::with("user")
->whereHas('user', function ($q) use ($org) {
$q->where('o_id', $org->o_id);
})->get();
$returns=array();
foreach($items as $item){
$returns[$item->b_id]=Member::createMemberFromBelong($item, $item->user);//BelongIDを添字とし、取得したユーザーデータを格納
}
なにやってるのか日本語で説明すると、Belongsテーブルにある(u_id)カラムを用いてusersテーブルとjoinしたモデルをEagerロードしたいわけですが、Belongsテーブルのo_id(団体ID)を参照して要らないデータは別に取ってこないでいいよ、っていう感じのやつです。とりあえずこういう書き方をすれば・・・・・・
クエリログを見ると、foreach内でuserを参照していますが、n+1問題が発生してないのでめでたしめでたし、って感じですね。
で、思ったんですけど、
1対多のリレーションも持ってこれたらどちゃくそ楽では!?!?って思ったんですよ。
んで、調べてみました。
雑にググったらそれっぽいのが載ってますね。
何をやりたいのかというと、所属グループの配列もどっかで取ってこれないかなと。
グループ情報は、HierarchyMembersというテーブルを介してHierarchiesというテーブルから取ってくることができ、こいつの情報が配列としてあれば後の処理がらくちんになるわけですね。
結構複雑そうな処理ですが、これを実現する機能がフレームワークにあるのなら使いたいところです。モデルを勝手に作ってくれるってすげーラクなんで・・・・・・。
DB::enableQueryLog();
$items = Belong::with("user")
->whereHas('user', function ($q) use ($org) {
$q->where('o_id', $org->o_id);
})->with("hierarchies")->get();
$returns=array();
foreach($items as $item){
foreach($item->hierarchies as $h){
var_dump($h->id);
}
$returns[$item->b_id]=Member::createMemberFromBelong($item, $item->user);//BelongIDを添字とし、取得したユーザーデータを格納
}
dd(DB::getQueryLog());
これ、雑に書いたテスト用のコードなんで実際の使い方とは異なるんですけど、これで関連先のモデルが取れてるんですよ・・・・・・。
ドン引きなんだけど・・・・・・(褒め言葉)
吐き出されたクエリを見ても無意味なことしてなくて理想的です。え・・・・・・やば・・・・・・こんなことできるんだ・・・・・・。
ちょっとぼくLaravelをナメてましたね・・・・・・。これ知らなくてちょっと無駄なコード書いてたかもしれん・・・・・・
なにがすごいって、8行目のforeachですよ!!!これがモデルの配列で取ってこれるようになってるってすごくない!?!?!?っていう話です。
絶対誰にも伝わってない
やー・・・・・・おったまげた。今日いちびっくりした。というメモでございました。(笑)
ってことで本日のおまけ。朝にやったものです。
神のみから引用するとお気に入りのキャラが偏っちゃいますね笑笑
えーと、何を意識して描いたんだっけな。とりあえずこの自信なさげな唇の描き方とかですか?(笑)
あとアタリの描き方を、最初にマルを描いてそこから横幅を絞る、みたいなやり方にしてみたりしてみました。なんか最初から楕円描くとバランスがおかしくなってるくさいので。
でもあれですね、やっぱ元絵となったもののちょっと下向いてる加減がうまく出せていない・・・・・・
目の位置をちょっと下めに取るとか・・・・・・?っていうか顔の平面がうまい角度で捕らえられてないよーな。一応顔の正面の中心点を基準にとってるつもりなんだけど、そことアタリの中心の真ん中ぐらいを基準にした方がうまくいくのだろうか・・・・・・???
でも目自体はそこそこ上手く描けるよーになったのかな。
あ、気づいたけどたぶん鼻と口の配置がよくないのかも。面を意識しすぎて、それでのっぺらぼうになってるのかも!!
見た感じ、鼻の位置はちょっと球を意識した配置になってるので、そこに描き込むといい感じになんのかな?