我有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')
有没有我可以重写的功能来实现这一目标?
答案 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