Laravel Eloquent如何覆盖基本查询?

时间:2018-12-13 04:40:00

标签: laravel laravel-5 eloquent override query-builder

我有2个模型共享同一张桌子。

表名:,我通过名为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');
    }
}

我想在这里实现

$results = Novel::where('title', 'LIKE', '%' . $title . '%')->get();

从此查询中,我希望它预先设置条件

where('type', 'novel')

有没有我可以重写的功能来实现这一目标?

2 个答案:

答案 0 :(得分:2)

使用匿名全局范围并将此启动方法添加到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();
  

现在如果您要删除给定查询的全局范围,则可以   可以使用withoutGlobalScope方法。

Novel::withoutGlobalScope('type')->get();

有关更多信息,请阅读此article

答案 1 :(得分:0)

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

public function scopeOfType($query, $type)
{
    return $query->where('type', $type);
}

并在调用范围时传递参数:

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

引用链接Laravel Scope