2018.12.20
団体用集金システムを作りたい!#17【閉包テーブルライブラリを使ってみよう】
いつまでちんたら作ってるんだって思われても仕方ありませんが、今日の話は
車輪の再発明してるせいでしたスミマセンみたいな話ができたらいいなっていう記事です。
興味ないと思いますけど、今ここまでいきました。所属してるメンバーの一覧を表示させる機能ですね。パッと見簡単なはずなのになんでこんな時間かかってるんでしょうね。
設計がガバってるからなんだよなぁ
んで、このグループですけど、ここでは親子構造とか考えずに取得してますけど、いずれ親子構造が必要になります。
この閉包テーブルを考える際、いちおう軽くライブラリを探したんですけど見つからなかったので自分で実装した・・・・・・んですが、
そういえば英語で探してないな?ということに気づき、試しにググってみたら
あった......という話です。(悲しみ)
これが、プログラミングの世界においてやっちゃいけないこと第一位の車輪の再発明ですね()
えーと、インストールですが、めっちゃ苦労しました(笑)
なんかよくわかんないうちに上手く行ったのでスルーしますけど、
composer require franzose/closure-tableとかいうコマンド実行したら上手く行きました。
Call to undefined method Illuminate\Foundation\Application::share() とかいうのにめっちゃ苦しめられたんだが・・・・・・。
っていうかこれLaravel5.4で廃止されたとか言ってるんですけど、修正しなくても通ったのよくわからない・・・・・・ああ、全くわからない・・・・・・。
んで、ごにょごにょやってたら、なんとなく使えそう?みたいなレベルにまで書けたのですが、とりたてて紹介するようなこともないよーな・・・・・・
static public function generateEntire(Org $org): HierarchyContainer{
//団体の所有するグループすべてを摘出
//DB::enableQueryLog();
$rootId=Hierarchy::whereNull("parent_id")->where("o_id",$org->o_id)->value("id");
$root = page::find($rootId);
//$entire=$root->getDescendantsTree();//rootが含まれてないと思う・・・・・・どうすれば・・・・・・
//dd($root);
$rootContainer= HierarchyContainer::create(/*$entire,*/ $root, 0);
//dd(DB::getQueryLog());
return $rootContainer;
}
static public function create(/*Page $entire,*/page $page,int $depth): HierarchyContainer{
$hc=new HierarchyContainer;
$hc->set("hierarchy",HierarchyFactory::createFromPage($page))
->set("page",$page)
->set("depth",$depth)
/*->set("entire",$entire)*/;//要らない可能性あり
$childrenPages=$page->getChildren();
if(!$page->hasChildren()){return $hc;}//もし子を持たなければ、そのまま返す
//子を持っていれば、それぞれを代入する
foreach ($childrenPages as $p){
$hc->setChild(HierarchyContainer::create(/*$entire,*/ $p, $depth+1));
}
return $hc;
}
一応、いま書いてるコードをそのまま引っ張ってきた感じです。ライブラリの動き方がよくわからんのですが、その動きを精査する前に
そもそも使用するデータの挿入部分が作れていないので、一応今こんな感じに仮で実装してます。
とはいえ、インターフェース的にはこれで確定で、あとは内部の型がどうなってるかがわかれば調整はできるかなって感じではあります。
が、これすごい懸念点があって、これ再帰ループで処理してるんですけど
なんか普通にいちいちSQL発行してるニオイがするんですよね・・・・・・。いや、ニオイがするっていうか、たぶん発行されてます。クエリログ見たら、ルートの1件取得するだけでも4回クエリ発行してます。
なんかすっげーいやな予感するんですよね・・・・・・。
ただまぁ、ロジックさえ動くのであれば、後でライブラリ部分は自作のものに置き換えてもなんとかはなるかなって思うので、それを見越した開発ができたらいいんですけど、これ全然できてないですね笑
理想としては、join済みデータをまとめて取ってきて、あとは配列操作でごにょごにょ、ってやった方がいいんじゃないのか?って思うんですけど、そーでもないんですかね・・・・・・。
でもインデックスとかちゃんと貼ればまた話は変わってくるのかもしれないので、しばらくはこのまま開発するとしましょう。
これまじで意味のない記事だな・・・・・・(笑)
ここ最近、また人間関係の荒波に揉まれている感じがするのだ。
なんか1年ほど前にも似たような悩みを抱えていたような気がするが、僕がおかしいのか周りがおかしいのか、わからなくなっている。
や、それは語弊があるな。たぶん、僕もおかしいんだろうし、周りもおかしいんだと思う。
んで、僕の何がいけないんだろう、僕の何を最適化すればいいんだろう、って、ちょっと考えてみたのさ。
んで、ある程度結論が出たんだけど、
僕の個性が強烈すぎて、周りに収まってないだけじゃないのかと。
や、個性が強いことをプラスとして言ってるわけじゃないけど、出る杭は打たれる文化が馴染む人、つまり世渡りが上手い人もいれば、僕のように個性の暴力で暴れまわるタイプもいる。それでいいじゃないか。
僕はむかしからみんなと仲良くなれる人を羨んでいた。だから、自分もそうなりたいと思って失敗し、現実を見たわけだ。
それで、接する人を選んだ上で、それでもってなるべく自分から接さないようにはしてたのに、それでもなぜか僕が傷つく結果に終わっている。
僕は自ら近づいていないはずなのに、勝手に近づいてきて、勝手に棘を投げつけてくるわけだ。
や、恋人関係と一緒なんだけどさ。付き合ってみないとわかんないことってあるしさ、そう、理性で考えられるとはいえ・・・・・・
つまるところ、僕はそういう小難しいことを考えて微調整できないほどに、個性が強すぎるのであろう(笑)
人と仲良くなることって僕にとってはきっと難しいことなのだろう。であれば、もう考えることはやめた方がいいのだろう。
親しくしてくれる分には構わない。僕はとりあえず、人に興味を持たない。僕は誰とも仲良くなれない。僕のことを好いてくれないのなら、僕が好く理由もない。
ただ僕ができることは、僕自身はなるべくキャパを広く持っておこう、ということである。過去を水に流せる器量の持ち主であろう、と。
ただ、ひとつ言えることは、今ぼくが住んでいるこの「環境」は、僕にとって窮屈すぎるということだ。
僕はもっと、自由気ままに生きられる空間を見つけなきゃいけない。僕に今の場所は向いていない。作るか探すかしなきゃだな。
って、わかってる話なのになかなか動き出そうとできなかったの、きっと僕の性根があまちゃんだからなのだろうな・・・・・・とも思う。
自分に対してよくしてくれない人に、よくない感情を持っても別にいいと思うんだけど、人に対してよくない感情を持つことが上手くできないのである。
それでも、僕は今生きている世界が窮屈だ、と感じた。その感情はきっと確かなのだろう。
きっと僕はこれから、好きなように生きていたら色んな人に腫れ物扱いされていくのであろう。その度に、少しずつ、傷ついていくのだろう。
まあ・・・・・・それで争おうとかいう気にならないあたりが僕の成長なのかなとも思うわけだけど。争いは同じレベルの者でしか発生し得ないとはよくいわれることである。
僕を拒絶するのも人の勝手ではあるが、それに僕自身が影響されるような物の考え方というか、甘さというか、現実の見れてなさはいい加減捨て去らなくてはいけないのかなあと思うのよ。
僕はそんなにコミュニケーションがうまく取れるタイプじゃない。僕は人に痕跡を残しながら通り過ぎることしかできねえんだわ、やっぱ。
でも、もういいんじゃないかな。この世界は僕を押し込めるには窮屈すぎる。
抜け出す努力を本格的に、やらなきゃな。そう思うわけである。