Laravel静态调用Overridden Eloquent first()方法

时间:2015-02-17 14:21:43

标签: laravel methods eloquent override

如果我覆盖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);
    }

}

我在这里失踪了什么?

1 个答案:

答案 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);
}