比起模型作用域scope有一种更好的方式:自定义builder
原理如下
Illuminate\Database\Eloquent\Model中
/*** Create a new Eloquent query builder for the model.** @param \Illuminate\Database\Query\Builder $query* @return \Illuminate\Database\Eloquent\Builder|static*/public function newEloquentBuilder($query){return new Builder($query);//返回一个builder}
创建自定义builder
namespace App\Builder;use Illuminate\Database\Eloquent\Builder;class XBuilder extends Builder{public function X(){$this->where("type","x");return $this;}public function Y(){$this->where("type","y");return $this;}}
模型中重写方法
<?phpnamespace App\Model;use App\Builder\XBuilder;use Illuminate\Database\Eloquent\Model;class Foo extends Model{use KpHasTimestamps;protected $primaryKey = 'id';protected $table = 'foo';protected $guarded = [];/*** 重写方法* @param \Illuminate\Database\Query\Builder $query* @return XBuilder*/public function newEloquentBuilder($query){return new XBuilder($query);}}
查看效果
现有数据
dump(Foo::query()->Y()->get());dd(Foo::query()->X()->get());
输出结果
