Я планирую иметь функцию, которая будет хранить инструкцию 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;
ли я что-то отсутствует?
Привет, ребята, я был в состоянии расширьте его, поместив копию 'newBaseQueryBuilder()' на ' ArdentBase'. Но я не получаю объект Collection, как я ожидал. Я получаю .. 'LaravelBook \ Ardent \ Builder' объект – lukaserat