まぁ僕も自分がクズなのは分かりきってて、それでもって
14時に起床するとその時点でやる気を失うという日を何度も繰り返してると流石に学習するわけですよ。
生活習慣がガタガタってそのレベルだったのかよって話ですけど
つまり、僕に必要なのは
睡眠時間の固定ですね。
社会人生活してる時はできたのに今できない理由は、なんだかんだでずるずる寝る時間を引き伸ばしているからです。
(何故そうなったかは記憶に)ないです
まぁ理想としては22時に寝るって決め打ちして、6時あるいは5時に起きる生活ですね。あんまり早すぎると近所のマックが使えないなどの弊害が生じるのでその日の予定と要相談なんですけどね・・・・・・。ほんとは早ければ早い方がいいんですけどね。
それはそうと、今日のテーマは
オレオレDAOクラスですね。
データベース操作をメソッドチェーンで書けるようにしたって話は
以前にしたんですが、それを好き勝手に拡張していくウチに割と素敵なクラスができつつあるんですよね。
まぁ、こう書くとクエリビルダは使いやすいんじゃないかっていうご紹介ですね。
まぁ、突貫工事で作ってるのでだいぶ無駄が多いのですが、また作り直す時にシェイプアップしようかなって思います。DAOクラスはどう考えても資産になりますしね。
雰囲気としてはこんな感じです。
class DAO{
public function get(){
return $this->query->get();
}
public function where($column,$exp,$val=null){
if($val===null){
$this->query->where($column,$exp);
}else{
$this->query->where($column,$exp,$val);
}
return $this;
}
public function whereDate($columne,string $date){
$this->query->whereDate($columne,$date);
return $this;
}
public function limit($int){
return $this->query->limit($int);
}
public function count(){
return $this->query->count();
}
public function update($array){
return $this->query->update($array);
}
public function first(){
return $this->query->first();
}
public function insert($array){
return $this->query->insert($array);
}
public function insertGetId($array):int{
return $this->query->insertGetId($array);
}
public function value($column){
return $this->query->value($column);
}
public function pluck($val){
return $this->query->pluck($val)->all();//Collectionは使ってないので、通常の配列として取得する。
}
public function id($mixed){
if(is_array($mixed)){
$this->query->wherein("id",$mixed);
}else if(is_positive_number($mixed)){
$this->query->where("id",$mixed);
}
return $this;
}
public function named_id($column,$mixed){
if(is_array($mixed)){
$this->query->wherein($column,$mixed);
}else if(is_positive_number($mixed)){
$this->query->where($column,$mixed);
}
return $this;
}
public function whereRaw($str){
return $this->query->whereRaw($str);
}
public function delete(){
return $this->query->delete();
}
public function whereAorB($A,$B){
$this->query->where(function ($query) use ($A,$B){
$query->where(function ($query)use ($A) {
$query->where($A[0], $A[1], $A[2]);
})
->orWhere(function ($query)use ($B) {
$query->where($B[0], $B[1], $B[2]);
});
});
return $this;
}
private function any_query($query,Array $array){
$method=$array[0];//なぜかArraytoStringエラーが起きるので
if(isset($array[3])){
$query->$method($array[1], $array[2], $array[3]);
}else if(isset($array[2])){
$query->$method(
$array[1],
$array[2]);
}else{
$query->$method
($array[1]);
}
}
private function AndArray($query,Array $array){
//配列で渡せばすべてAndで実行する
foreach($array as $a){
$this->any_query($query,$a);
}
}
public function whereAndArray(Array $array){
//AandB or CandD...みたいなのを処理するもの
//[[[A][B]],[[C][D][E]],...]みたいなのを渡して欲しい
//思いつきで拡張性をもたせようと、WhereOrArrayと書式を変えてる。注意。RC版で訂正してね。
$this->query->where(function ($query) use ($array){
$i=0;//フラグ(一応ね)
$query->where(function ($query)use ($array) {
$this->AndArray($query,$array[0]);//A and B ...
});
foreach($array as $a){
if($i===0){
$i=1;//最初はもう入れてあるので
}else{
$query->orwhere(function ($query)use ($a) {
$this->AndArray($query,$a);//or C and D and...
});
}
}
});
return $this;
}
public function whereOrArray(Array $array){
$this->query->where(function ($query) use ($array){
$i=0;//フラグ(一応ね)
$query->where(function ($query)use ($array) {
$query->where($array[0][0], $array[0][1], $array[0][2]);
});
foreach($array as $a){
if($i===0){
$i=1;//最初はもう入れてあるので
}else{
$query->orwhere(function ($query)use ($a) {
$query->where($a[0], $a[1], $a[2]);
});
}
}
});
return $this;
}
//拡張性を持たせた版。
private function whereOrArray_R($query,Array $array){
$this->query->where(function ($query) use ($array){
$i=0;//フラグ(一応ね)
$query->where(function ($query)use ($array) {
$this->any_query($query, $array[0]);
});
foreach($array as $a){
if($i===0){
$i=1;//最初はもう入れてあるので
}else{
$query->orwhere(function ($query)use ($a) {
$this->any_query($query, $a);
});
}
}
});
return $this;
}
public function whereNull($column){
$this->query->whereNull($column);
return $this;
}
public function leftJoin($column,$left,$exp,$right){
$this->query->leftJoin($column,$left,$exp,$right);
return $this;
}
}
僕のプログラミングスキルの低さが露呈するコードですけど(笑)、今現状DAOクラスはこんな感じになってます。
新旧コードが入り乱れてるせいで大変見づらいですが、こんな感じで書いたものを継承していくと、結構いい感じになります。
このクラスの肝は
whereOrArray_Rと
whereAndArrayあたりですね。
このクロージャで書く部分、
大体生で書いてるとバグってしんどいのでサブルーチン化してみました。
配列で書くといい感じに処理してくれます。最初はwhere句限定で書いてたんですが、whereNullとか自由自在に指定できた方が将来性あるなって思ってさっき書き換えました。
ただ、関数を指定する部分を新たに追加したせいで互換性を切らざるを得なくなり、_Rなんていう関数が誕生してしまったわけです(笑)
any_query()があるので、実際はwhereとか要らないんですけど、単純に読みやすさと書きやすさが向上するので入れてます。
必要になったらその都度DAOクラスに書き加えることにしてます。
あと、何気に便利なのが
id()ですね。これ、intで渡しても配列で渡しても動くんですよ(笑)
単一のIDを指定した場合、そのIDで絞り込みますが配列で渡すとWhereinで処理することで、「配列に存在するIDで」っていう処理に切り替わってくれるんですよ。さらっとidって言ってますけどめっちゃ便利です。
僕はEloquentモデルを使わずにクエリビルダを使う派ですし、たぶんずっとそうなんだと思います。クエリビルダは僕みたいな初心者にとっては直感的で使いやすいし、壁にぶち当たらない限りEloquentは使わないかなぁーと思うので(笑)
あと、もっと早く気づいておくべきだったなーと思ったのは、生SQLの取得ですね。
DB::enableQueryLog();
//ここでDB操作
dd(DB::getQueryLog());
こうすると、なんのSQLが実行されているか見れます。
まぁ通常は必要ないんですが、こういうAndとかOrとか入り乱れたものを書く場合は、ちゃんと取れてるのか?ってチェックできるので大変便利でございます(笑)