比起模型作用域scope有一种更好的方式:自定义builder

原理如下
Illuminate\Database\Eloquent\Model中

  1. /**
  2. * Create a new Eloquent query builder for the model.
  3. *
  4. * @param \Illuminate\Database\Query\Builder $query
  5. * @return \Illuminate\Database\Eloquent\Builder|static
  6. */
  7. public function newEloquentBuilder($query)
  8. {
  9. return new Builder($query);//返回一个builder
  10. }

因此可以重写模型中该方法

创建自定义builder

  1. namespace App\Builder;
  2. use Illuminate\Database\Eloquent\Builder;
  3. class XBuilder extends Builder
  4. {
  5. public function X(){
  6. $this->where("type","x");
  7. return $this;
  8. }
  9. public function Y(){
  10. $this->where("type","y");
  11. return $this;
  12. }
  13. }

模型中重写方法

  1. <?php
  2. namespace App\Model;
  3. use App\Builder\XBuilder;
  4. use Illuminate\Database\Eloquent\Model;
  5. class Foo extends Model
  6. {
  7. use KpHasTimestamps;
  8. protected $primaryKey = 'id';
  9. protected $table = 'foo';
  10. protected $guarded = [];
  11. /**
  12. * 重写方法
  13. * @param \Illuminate\Database\Query\Builder $query
  14. * @return XBuilder
  15. */
  16. public function newEloquentBuilder($query)
  17. {
  18. return new XBuilder($query);
  19. }
  20. }

查看效果

现有数据
image.png

  1. dump(Foo::query()->Y()->get());
  2. dd(Foo::query()->X()->get());

输出结果
image.png