重写 Laravel get 和 First 方法

nik*_*srb 2 laravel

我需要重写上面提到的方法来跳过一些数据库记录。使用where不是一个选项,因为我每次都必须使用它,因为数据库中有一些我大部分时间不需要的记录,并且不允许我从数据库中删除它们。这是我这样做的尝试:

class SomeTable extends BaseModel { 

    public static function first() {
       $query = static::query();
       $data = $query->first();
       if($data && $data->type == 'migration_type') return null;

       return $data;
    }

    public static function get() {
       $query = static::query();
       $data = $query->get();
       foreach($data as $key => $item) {
           if($item->type == 'migration_type') unset($data[$key]); 
       }

       return $data;
    }
}
Run Code Online (Sandbox Code Playgroud)

该代码的问题在于它仅在直接调用模型时才有效。如果我使用一些其他函数,例如where, beforegetfirst方法,它只会跳过我覆盖的方法。执行此操作的正确方法是什么?我应该将此代码放入模型中吗?

我的问题不重复,正如上述问题的答案所示:

从扩展您的 CustomModel 的模型发出的所有查询都将获得这个新方法

我需要仅针对特定模型覆盖这两个函数,而不是针对应用程序中的每个函数,因为并非所有表都有type列。这就是我在模型类中编写它们的原因。

cee*_*yoz 5

我需要重写上面提到的方法来跳过一些数据库记录。

考虑模型的全局查询范围。

https://laravel.com/docs/5.8/eloquent#global-scopes

全局范围允许您向给定模型的所有查询添加约束。Laravel 自己的软删除功能利用全局范围仅从数据库中提取“未删除”模型。编写自己的全局作用域可以提供一种方便、简单的方法来确保给定模型的每个查询都受到某些约束。