Laravel雄辩地说明了如何覆盖基本查询?

Laravel雄辩地说明了如何覆盖基本查询?,laravel,laravel-5,eloquent,overriding,query-builder,Laravel,Laravel 5,Eloquent,Overriding,Query Builder,我有两个模型共用一张桌子 表名:books,我通过一个名为type 书籍型号 class Book extends \Illuminate\Database\Eloquent\Model { protected $table = 'books'; } class Novel extends Book { protected $table = 'books'; // Is such a method available? protected function s

我有两个模型共用一张桌子

表名:books,我通过一个名为
type

书籍型号

class Book extends \Illuminate\Database\Eloquent\Model
{
    protected $table = 'books';
}
class Novel extends Book
{
    protected $table = 'books';

    // Is such a method available?
    protected function someMethodToOverride()
    {
        $this->where('type', 'novel');
    }
}
新颖的模型

class Book extends \Illuminate\Database\Eloquent\Model
{
    protected $table = 'books';
}
class Novel extends Book
{
    protected $table = 'books';

    // Is such a method available?
    protected function someMethodToOverride()
    {
        $this->where('type', 'novel');
    }
}
我想在这里实现的是

$results = Novel::where('title', 'LIKE', '%' . $title . '%')->get();
从这个查询中,我希望它预先设置条件

where('type', 'novel')

是否有任何功能可以替代以实现此目的?

在模型中,您可以使用范围:

public function scopeOfType($query, $type)
{
    return $query->where('type', $type);
}
并在调用作用域时传递参数:

 Model::ofType('novel')
        ->where('title', 'LIKE', '%' . $title . '%')
        ->get();

请参阅链接

使用匿名全局作用域,并将此引导方法添加到
Novel
模型中

protected static function boot()
    {
        parent::boot();

        static::addGlobalScope('type', function (\Illuminate\Database\Eloquent\Builder $builder) {
            $builder->where('type', 'novel');
        });
    }
现在它将自动添加查询

$results = Novel::where('title', 'LIKE', '%' . $title . '%')->get();
现在,如果要删除给定查询的全局范围,可以 可以使用不带GlobalScope的
方法


要了解更多信息,请阅读此

Wow~这正是我想要的。谢谢