我需要重写上面提到的方法来跳过一些数据库记录。使用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, beforeget或first方法,它只会跳过我覆盖的方法。执行此操作的正确方法是什么?我应该将此代码放入模型中吗?
我的问题不重复,正如上述问题的答案所示:
从扩展您的 CustomModel 的模型发出的所有查询都将获得这个新方法
我需要仅针对特定模型覆盖这两个函数,而不是针对应用程序中的每个函数,因为并非所有表都有type列。这就是我在模型类中编写它们的原因。
我需要重写上面提到的方法来跳过一些数据库记录。
考虑模型的全局查询范围。
https://laravel.com/docs/5.8/eloquent#global-scopes
全局范围允许您向给定模型的所有查询添加约束。Laravel 自己的软删除功能利用全局范围仅从数据库中提取“未删除”模型。编写自己的全局作用域可以提供一种方便、简单的方法来确保给定模型的每个查询都受到某些约束。
| 归档时间: |
|
| 查看次数: |
1647 次 |
| 最近记录: |