Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Laravel 4 и кеширование запросов
#1
Недавно присмотрел фреймворк Laravel и захотелось разобраться хоть с самым малым. Все получается и с моделями и с контроллерами, но вот обнаружил одну неприятность, а именно в кешировании запросов.

Есть модель...

PHP код:
<?php 
class News extends Eloquent
{
public function
author()
{
return
$this->belongsTo('Author');
}
}

Чтобы выбрать все новости я пишу...

PHP код:
<?php 
$news
= News::remember(30)->get();

На этом этапе все хорошо, запрос проходит только 1 раз за 30 минут.

Но только я попытаюсь вывести ник автора новости...

PHP код:
<?php 
foreach ($news as $n)
{
var_dump($n->author->username);
}

То независимо от того, использую я remember или нет - в логах запросов такое:

PHP код:
<?php 
select
* from `authors` where `authors`.`id` = '1' limit 1
select
* from `authors` where `authors`.`id` = '1' limit 1
select
* from `authors` where `authors`.`id` = '1' limit 1
select
* from `authors` where `authors`.`id` = '1' limit 1
select
* from `authors` where `authors`.`id` = '1' limit 1

Что не так, не понимаю...
Ответ
#2
Причина в неиспользовании активной загрузки.

[SRC="php"]$news = News::with('author')->remember(30)->get();[/SRC]
Ответ
#3
Спасибо! От части проблему решило, но всеравно игнорирует remember и каждый раз делает запрос...

PHP код:
<?php 
select
* from `authors` where `authors`.`id` in ('1')

:confused:
Ответ
#4
remember() кеширует результат выборки, в вашем случае:

[SRC="sql"]select * from news[/SRC]


Cвязи author в этом результате нет и не будет.

Как вариант (не всегда применимо):

[SRC="php"]$news = Cache::remember('news', 30, function() {
return News::with('author')->get();
});[/SRC]
Ответ
#5
Супер! Спасибо!

Цитата:0 statements were executed
Ответ
#6
Оказалось этого недостаточно, так как вспомнил о том, что потребуется и разбивка по страницам. Хотелось бы выводить не больше 5 новостей на страницу.

Может подскажете, почему этот вариант не работает...

PHP код:
<?php 
$news
= Cache::remember('news', 30, function () {
return
News::with('author')->paginate(5);
});

Говорит...

Цитата:Serialization of 'Closure' is not allowed

Пробовал без Cache::remember()...

PHP код:
<?php 
$news
= News::with('author')->remember(30)->paginate(5);

Так работает, но все таже проблема с некешируемым запросом к авторам (3 сообщение).
Ответ
#7
Поэтому я и написал, что не всегда применимо. Связями можно управлять через замыкание:

[SRC="php"]$news = News::with([
'author' => function ($query) {
$query->remember(30);
}
])->remember(30)->paginate(5);[/SRC]
Ответ
#8
Как же все просто... Получается в массиве можно управлять и не одной связанной моделью.
Спасибо! :drink:
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  Посоветуйте Наработки на Laravel для Ecommerce Сайта (цифр товары) GaillarderTk 0 3,241 04-29-2017, 12:14 AM
Последний пост: GaillarderTk
  Laravel собственный атрибут в ответе json Cache 1 3,379 07-23-2015, 07:25 AM
Последний пост: PROGRAMMATOR

Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)