【问题标题】:Laravel Eloquent how to override the base query?Laravel Eloquent 如何覆盖基本查询?
【发布时间】:2019-05-14 06:30:13
【问题描述】:

我有 2 个模型共享同一个表。

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

我想在这里实现的是

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

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

where('type', 'novel')

有没有我可以重写的函数来实现这一点?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 哇~正是我想要的。谢谢
    【解决方案2】:

    在模型中你可以使用作用域:

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

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

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

    参考链接Laravel Scope

    【讨论】:

      猜你喜欢
      • 2015-02-02
      • 2019-12-20
      • 1970-01-01
      • 1970-01-01
      • 2017-10-22
      • 2021-07-20
      • 1970-01-01
      • 2021-08-27
      • 2021-12-26
      相关资源
      最近更新 更多