重写Laravel get和first方法

重写Laravel get和first方法,laravel,Laravel,我需要重写上述方法来跳过一些数据库记录。使用,其中不是一个选项,因为我必须每次都使用它,因为数据库中有一些记录我大部分时间都不需要,并且我不允许从数据库中删除它们。以下是我的尝试: class SomeTable扩展了BaseModel{ 公共静态函数优先(){ $query=static::query(); $data=$query->first(); 如果($data&&$data->type=='migration_type')返回null; 返回$data; } 公共静态函数get(){

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

class SomeTable扩展了BaseModel{
公共静态函数优先(){
$query=static::query();
$data=$query->first();
如果($data&&$data->type=='migration_type')返回null;
返回$data;
}
公共静态函数get(){
$query=static::query();
$data=$query->get();
foreach($key=>$item形式的数据){
如果($item->type=='migration_type')未设置($data[$key]);
}
返回$data;
}
}
此代码的问题在于,它仅在模型上直接调用时才起作用。如果我正在使用一些其他函数,比如
where
,在
get
first
方法之前,它只是跳过我的重写方法。 做这件事的正确方法是什么?我应该把这段代码放在模型中吗

我的问题与上述问题的答案不同,答案是:

从扩展CustomModel的模型中进行的所有查询都将获得此新方法


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

因为在调用处理数据库生成器的位置后,模型中的这些方法没有被调用。。关于这个问题,您可以通过使用
select
而不是直接使用
first
来克服它,因此将处理生成器

例如:

SomeTable::select('col1','col2')->take(1)->get();
如果您与其他开发人员在同一个项目上工作,那么覆盖此类方法的另一件事不是一个好主意


祝你好运

这里的问题是模型上的where()方法返回一个
QueryBuilder
实例,其中get()将返回一个
集合
实例

您应该能够通过在集合的位置添加宏来覆盖集合的默认方法,并且可以这样做

Collection::macro('toUpper', function () {
    return $this->map(function ($value) {
        return Str::upper($value);
    });
});
扩展QueryBuilder实例并不容易,但是有一个很好的教程,它涉及覆盖应用程序的默认连接类,这对于将来的升级来说并不太好

我需要重写上述方法来跳过一些数据库记录

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

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


可能是重复的我已经检查了这一个,但答案不清楚我打赌在返回的父::where(****)你可以把你自己的->where(你的条件总是检查)@Djip你能在答案中解释得更进一步一点吗?我想这是有用的地方。我正在与其他开发人员合作,但这只是一种模式,我们都需要这种改变。应用程序太大,无法在其查询中更改每个
get
以使用
select
。我希望有一种方法能完全满足我的需要当然,我的朋友,总有一种方法。。但为了保持整洁,我建议将此模型的类型从雄辩的模型更改为sql对象,并在类中接受查询生成器,并使用
\uu call
magic方法将get或first的调用映射到自定义方法,同时获得查询的好处builder@niksrb需要注意的一点是:全局作用域不会可以应用于任何原始的
DB::
调用,因为这些调用完全绕过了雄辩的模型。如果您总是使用该模型来构建查询,那么就不会有问题了。