Кэширование отношений, загруженных в модель (защищено $with) с помощью Laravel и Eloquent

В моей модели Article я стремлюсь загрузить отношения категорий в модели:

protected $with = array('category');

Когда я получаю свои статьи в контроллере, я кэширую результаты как своих статей, так и отношений, которые я хочу загрузить туда:

$articles = Article::with([
   'owner' => function ($q) {$q->remember(10);},
   'tags' => function ($q) {$q->remember(10);},
   'thumbnail' => function ($q) {$q->remember(10);}
   ])
   ->remember(10)->get();

Но; article.category не кэшируется. Я думал, что он будет закэширован вместе с моделью Article, так как он с нетерпением загружается в эту модель. Но этого не происходит.

Однако он кэшируется, если я хочу загрузить (с кешем) в контроллер, добавив это в свой Article::with:

'category' => function ($q) {$q->remember(10);}

Я знаю, что могу remember() сами отношения:

public function category()
{
    return $this->belongsTo('Category', 'category_id')->remember(10);
}

Но тогда он всегда будет кешироваться, я хотел бы определить, будет ли он кешироваться в контроллере и как долго. Поскольку значения могут меняться в зависимости от использования.

Это возможно? Или кэширование должно быть определено в модели, так как там происходит активная загрузка?


person Thomas Jensen    schedule 07.10.2014    source источник
comment
Просто используйте with('category' => ... в своем контроллере.   -  person Jarek Tkaczyk    schedule 08.10.2014
comment
Вчера вечером провел тест и пришел к такому же выводу. Я заметил, что в конечном итоге я сделал много ненужной загрузки отношений компонентов. Спасибо за ваш вклад в это :)   -  person Thomas Jensen    schedule 08.10.2014
comment
Пожалуйста. Однако вы можете извлечь это в репозиторий, чтобы не набивать контроллер всей этой логикой. А репозитории сейчас в моде ;)   -  person Jarek Tkaczyk    schedule 08.10.2014
comment
Я видел всплывающее выражение, но я не знаком с ним (вне мира git). Похоже, у меня впереди кое-какие исследования, еще раз спасибо :) О, и я добавлю ссылку на ваш сайт SOFTonSOFA, когда мой сайт заработает, отличный ресурс Eloquent палец вверх   -  person Thomas Jensen    schedule 08.10.2014
comment
Найдите шаблон репозитория, чтобы узнать больше. В Laravel World репозиторий в основном относится к абстракции над уровнем хранения (будь то db и eloquent или что-то еще), что отделит ваши контроллеры от используемого вами механизма сохранения. И, что более важно, это упрощает тестирование вашего кода.   -  person Jarek Tkaczyk    schedule 08.10.2014
comment
@JarekTkaczyk Если вы изложите это в форме ответа, я приму это.   -  person Thomas Jensen    schedule 17.10.2014


Ответы (1)


Просто используйте with('category' => ... в своем контроллере.

Однако вы можете извлечь это в репозиторий, чтобы не набивать контроллер всей этой логикой. А репозитории сейчас в моде ;)

Найдите шаблон репозитория, чтобы узнать больше.

В Laravel World репозиторий в основном относится к абстракции над уровнем хранения (будь то db и eloquent или что-то еще), что отделит ваши контроллеры от используемого вами механизма сохранения.

И, что более важно, это упрощает тестирование кода.

person Jarek Tkaczyk    schedule 17.10.2014