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