2013-11-27 4 views
1

Я планирую иметь функцию, которая будет хранить инструкцию sql в кэше с использованием заданного второго параметра в remember() в качестве ключа, и всякий раз, когда изменяется оператор sql, он будет работать против базу данных снова и перезаписать сохраненный sql, также полученный в кэше результат, а если нет, он возьмет полученный по умолчанию результат с помощью функции remember().Как продлить Illuminate Database Query Builder

Так я планирую иметь что-то вроде этого на Осветите \ 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; 
} 

Но дело в том, что я не хочу, чтобы поставить это непосредственно на Осветите \ Database \ Query \ Builder потому что это только моя потребность в текущем приложении, в котором я работаю. Я пытаюсь расширить Illuminate \ Database \ Query \ Builder, но проблема в том, что он не обнаруживает мой класс расширения.

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

My Extension Class

<?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; 

ли я что-то отсутствует?

+0

Привет, ребята, я был в состоянии расширьте его, поместив копию 'newBaseQueryBuilder()' на ' ArdentBase'. Но я не получаю объект Collection, как я ожидал. Я получаю .. 'LaravelBook \ Ardent \ Builder' объект – lukaserat

ответ

0

Правильно ли я переписать get() метод на Осветите \ Database \ Query \ Builder путем переименования функции я сделал в моем классе расширения от getCachedByQuery до get, так как я просто расширяя рутина get.

Я изменил

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

в

public function get() 

на моем Lukaserat\Traits\QueryBuilder

и теперь работает, как я ожидал ..

Смежные вопросы