如果我覆盖eloquent的first()方法,我无法像我期望的那样静态地调用该方法(通过外观)。我希望将使用已实现的__callStatic()方法(在Illuminate\Database\Eloquent\Model
中实现),但事实并非如此。
所以我试着自己实现魔法。我仍然无法静态访问overrided first()方法。
ErrorException:非静态方法Entity :: first()不应该是 静态调用,假设$ this来自不兼容的上下文。
class Entity extends Eloquent
{
public function first($columns = ['*'])
{
if (Cache::tags(static::getTags())->has('first')) :
return Cache::tags(static::getTags())->get('first');
endif;
$result = parent::first($columns);
if ($result) :
Cache::tags(static::getTags())->put('first', $result, with(new static)->ttl);
endif;
return $result;
}
public static function __callStatic($method, $parameters)
{
$instance = new static;
return call_user_func_array(array($instance, $method), $parameters);
}
}
我在这里失踪了什么?
答案 0 :(得分:2)
我已经表示怀疑是否有必要覆盖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);
}