Laravel Eloquent如何覆盖基础查询?

3

我有两个模型共用一张表。

表名为books,我通过一个名为type的属性来区分普通书籍和小说。

Book模型:

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');
    }
}

What I want to achieve here is

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

从这个查询中,我希望它预设条件。
where('type', 'novel')

有没有可以重写的函数来实现这个功能?
2个回答

5

使用匿名全局作用域,并在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();

了解更多信息,请阅读此文章


该文章涉及IT技术中的全局作用域问题,请参考。

1
哇~ 真是我想要的。谢谢。 - Js Lim

0

在模型中,您可以使用作用域(scope):

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

在调用作用域时传递参数:

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

请查看链接Laravel作用域


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接