2013-12-14 3 views
3

У меня проблемы с кэшированием моих запросов. Каждый раз, когда я ударяю свой API, я получаю свежие результаты из базы данных вместо результатов кэширования, которые им нужны. Странно, если я посмотрю в кеш-файле, я вижу результаты кэширования, и они точно такие, чего я ожидаю, но когда я вызываю API, я получаю свежие результаты. Ниже приведены некоторые фрагменты соответствующих файлов. Где я здесь не так?Laravel 4 Query Cache

Repository Функция мои API вызовы:

public function topMonth() 
{ 
    $top = $this->repository->month()->top()->joinUser()->remember(30)->get(['things.id', 'things.votes', 'things.title', 'things.description', 'things.tags', 'things.created_at', 'users.id as user_id','users.username','users.picture as user_picture'])->toArray(); 

    return $top; 
} 

Модель

class Thing extends Eloquent 
{ 

public function scopeTop($query) 
{ 
    return $query->orderBy('things.votes', 'desc'); 
} 

public function scopeYear($query) 
{ 
    return $query->whereRaw("things.created_at > STR_TO_DATE('" . Carbon::now()->subYear() . "', '%Y-%m-%d %H:%i:%s')"); 
} 

public function scopeMonth($query) 
{ 
    return $query->whereRaw("things.created_at > STR_TO_DATE('" . Carbon::now()->subMonth() . "', '%Y-%m-%d %H:%i:%s')"); 
} 

public function scopeWeek($query) 
{ 
    return $query->whereRaw("things.created_at > STR_TO_DATE('" . Carbon::now()->subWeek() . "', '%Y-%m-%d %H:%i:%s')"); 
} 

public function scopeDay($query) 
{ 
    return $query->whereRaw("things.created_at > STR_TO_DATE('" . Carbon::now()->subDay() . "', '%Y-%m-%d %H:%i:%s')"); 
} 

public function scopeJoinUser($query) 
{ 
    return $query->join('users', function($join) 
     { 
      $join->on('users.id', '=', 'things.created_by'); 
     }); 
} 

} 

ответ

11

Вы сможете только в кэш, как, что, если ваш запрос остается точно такой же. В этом случае это не связано с вашей областью запросов top().

Это связано с тем, как построитель запросов генерирует ключ кеша. Он преобразует весь запрос в SQL и упорядочивает это переплеты, а obsered в коде Laravel ниже:

/** 
* Generate the unique cache key for the query. 
* 
* @return string 
*/ 
public function generateCacheKey() 
{ 
    $name = $this->connection->getName(); 

    return md5($name.$this->toSql().serialize($this->bindings)); 
} 

Вместо этого, вам придется вручную кэшировать это как так;

if (($top = Cache::get('users.top')) === null) 
{ 
    $top = $this->repository->month()->top()->joinUser()->get(['things.id', 'things.votes', 'things.title', 'things.description', 'things.tags', 'things.created_at', 'users.id as user_id','users.username','users.picture as user_picture'])->toArray(); 
    Cache::put('users.top', $top, 30); 
} 
+0

Благодарим вас за то, что вы просто не дали ответа, но объяснили, почему так оно и есть. Вы джентльмен и ученый! –