クエリビルダを直接使う場合はオーバーライドしたクラスを使えばそれで済むのだが、
モデルだとどうしていいかわからなかったので調べて実装してみた。
fuelphpとかだとmodelに書けば動いてくれたけど、
laravelの場合はクエリビルダを別に生成してるのでmodelオーバーライドしても有効にならない。
開始終了を入力して範囲検索する場合、
どちらか片方だけ入力した場合とか入力してない場合にいちいち毎回判定してwhereに振るのがめんどくさい。
ということで
whereBetweenをオーバーライドして勝手にやってくれるようにする。
適当に app\CustomQueryBuilder.php とかに以下を保存。
入力判定をemptyでやってるのは存在しない場合に null ではなく “” を返しているため、
数値で0を使いたい場合等は対策が必要。
<?php
namespace App;
use Illuminate\Database\Query\Builder;
class CustomQueryBuilder extends Builder
{
/**
* 指定なしならそのまま、片方だけなら where に振る
*
* @param string $column
* @param array $values
* @param string $boolean
* @param bool $not
* @return \App\ModelBase
*/
public function whereBetween($column,array $values,$boolean = 'and',$not = false)
{
if( !empty($values[0]) && !empty($values[1]) ){
return parent::whereBetween($column,$values,$boolean,$not);
} else if(!empty($values[0])){
return $this->where($column,'>=',$values[0]);
} else if(!empty($values[1])){
return $this->where($column,'<=',$values[1]);
}
return $this;
}
}
モデルのクエリビルダ作ってるところをオーバーライドする、これを継承してモデル作れば全部に適用されて楽。
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use DB;
class ModelBase extends Model
{
protected function newBaseQueryBuilder()
{
$connection = $this->getConnection();
$grammar = $connection->getQueryGrammar();
return new CustomQueryBuilder($connection,$grammar,$connection->getPostProcessor());
}
}