Laravel静态调用重写的雄辩';s first()方法

Laravel静态调用重写的雄辩';s first()方法,laravel,methods,eloquent,overriding,Laravel,Methods,Eloquent,Overriding,如果我重写eloquent的第一个()方法,我就不能像预期的那样静态地(通过facade)调用该方法。我希望会使用实现的uu callStatic()方法(在illumb\Database\elount\Model中实现),但事实并非如此 所以我试着自己实现这个神奇的方法。我仍然无法静态访问重写的first()方法 ErrorException:不应使用非静态方法实体::first() 静态调用,假设$this来自不兼容的上下文 我在这里遗漏了什么?我已经表示怀疑是否有必要为缓存目的重写firs

如果我重写eloquent的第一个()方法,我就不能像预期的那样静态地(通过facade)调用该方法。我希望会使用实现的uu callStatic()方法(在
illumb\Database\elount\Model
中实现),但事实并非如此

所以我试着自己实现这个神奇的方法。我仍然无法静态访问重写的first()方法

ErrorException:不应使用非静态方法实体::first() 静态调用,假设$this来自不兼容的上下文


我在这里遗漏了什么?

我已经表示怀疑是否有必要为缓存目的重写
first()
,但当然,从技术上讲,这是可能的

您必须为此创建自己的
Builder
类:

class MyBuilder extends Illuminate\Database\Eloquent\Builder {

    /**
     * Execute the query and get the first result.
     *
     * @param  array  $columns
     * @return \Illuminate\Database\Eloquent\Model|static|null
     */
    public function first($columns = array('*'))
    {
        if ($someCondition) :
            return 1;
        endif;

        return parent::first($columns);
    }
}
然后通过实现
newEloquentBuilder
方法,使您的模型使用此生成器:

public function newEloquentBuilder($query)
{
    return new MyBuilder($query);
}

目标是在应用程序和数据库请求之间添加额外的“缓存”功能。这意味着在进行数据库调用之前,我检查模型是否已经缓存。如果是这种情况,我将返回缓存模型。。。。我们的目标是能够静态地和通过实例调用被重写的eloquent的first()方法。也许您可以使用?但这不是我的问题。问题正如我在文章中所描述的。我理解这一点,但我怀疑我不认为你应该重写
first()
来实现你自己的缓存…:)我认为这不是我的情况。我已经使用了已实现的laravel缓存系统。我认为实现缓存模型检查的最佳层是我现在尝试的地方。
public function newEloquentBuilder($query)
{
    return new MyBuilder($query);
}