1

我打算有一个函数,它将使用给定的第二个参数 onremember()作为键将 sql 语句存储在缓存上,并且每当 sql 语句更改时,它将再次针对数据库运行并覆盖存储的 sql,以及缓存的结果,如果不是,它将采用remember()函数的默认缓存结果。

所以我打算在 Illuminate\Database\Query\Builder 上有这样的东西

/**
 * Execute the query based on the cached query
 *
 * @param  array  $columns
 * @return array|static[]
 */
public function getCacheByQuery($columns = array('*'))
{
    if ( ! is_null($this->cacheMinutes))
    {
        list($key, $minutes) = $this->getCacheInfo();

        // if the stored sql is the same with the new one then get the cached
        // if not, remove the cached query before calling the getCached
        $oldSql = self::flag($key);
        $newSql = $this->toSql().implode(',', $this->bindings);
        if ($newSql!==$oldSql)
        {
            // remove the cache
            \Cache::forget($key);
            // update the stored sql
            self::updateFlag($key, $newSql);
        }

        return $this->getCached($columns);

    }

    return $this->getFresh($columns);
}

public static function updateFlag($flag, $value)
{
    $flags = \Cache::get(t().'databaseFlags', []);
    $flags[$flag] = $value;
    \Cache::put(t().'databaseFlags',  $flags, USER_SESSION_EXPIRATION);
}

public static function flag($flag)
{
    $flags = \Cache::get(t().'databaseFlags', []);
    return @$flags[$flag] ?: false;
}

但问题是,我不想将它直接放在 Illuminate\Database\Query\Builder 上,因为它只是我正在工作的当前应用程序的需要。我正在尝试扩展 Illuminate\Database\Query\Builder,但问题是它没有检测到我的扩展类。

Call to undefined method Illuminate\Database\Query\Builder::getCachedByQuery()

我的扩展类

<?php namespace Lukaserat\Traits;

class QueryBuilder extends \Illuminate\Database\Query\Builder  {

    /**
     * Execute the query based on the caced query
     *
     * @param  array  $columns
     * @return array|static[]
     */
    public function getCachedByQuery($columns = array('*'))
    {
        if ( ! is_null($this->cacheMinutes))
        {
            list($key, $minutes) = $this->getCacheInfo();

            // if the stored sql is the same with the new one then get the cached
            // if not, remove the cached query before calling the getCached
            $oldSql = self::flag($key);
            $newSql = $this->toSql().implode(',', $this->bindings);
            if ($newSql!==$oldSql)
            {
                // remove the cache
                \Cache::forget($key);
                // update the stored sql
                self::updateFlag($key, $newSql);
            }

            return $this->getCached($columns);

        }

        return $this->getFresh($columns);
    }

    public static function updateFlag($flag, $value)
    {
        $flags = \Cache::get(t().'databaseFlags', []);
        $flags[$flag] = $value;
        \Cache::put(t().'databaseFlags',  $flags, USER_SESSION_EXPIRATION);
    }

    public static function flag($flag)
    {
        $flags = \Cache::get(t().'databaseFlags', []);
        return @$flags[$flag] ?: false;
    }


}

实施于..

<?php
use LaravelBook\Ardent\Ardent;
use Lukaserat\Traits\DataTable;
use Lukaserat\Traits\QueryBuilder as QueryBuilder;
use Illuminate\Support\MessageBag as MessageBag;

class ArdentBase extends Ardent implements InterfaceArdentBase{
    use DataTable;

我错过了什么吗?

4

1 回答 1

0

get()通过将我在扩展类中创建的函数重命名为 to 来覆盖 Illuminate\Database\Query\Builder 上的方法getCachedByQuery是否正确,get因为我只是扩展了get.

我变了

public function getCachedByQuery($columns = array('*'))

public function get()

在我的Lukaserat\Traits\QueryBuilder

现在它正在按我的预期工作..

于 2013-11-27T09:00:48.563 回答