Просто пример: скажем, у меня есть модель публикации и модель комментария. У поста, конечно же, есть комментарии, отношения «один ко многим».
Я должен отображать список сообщений с комментариями под ним.
Получу свои сообщения в контроллере:
$posts = Post::get(), в вид лезвия передам а потом прошиваю
@foreach($posts as $post)
{{ $post->title }}
{{ $post->comments }}
@endforeach
где $post->comments - некоторое соотношение
public function comments()
{
return $this->hasMany(Comment::class);
}
Как мы знаем, этот запрос будет выполняться много раз.
Теперь мой вопрос: как нам его оптимизировать?
Cache::remember в геттер?{{ $post->comments }} не вызовет связь снова вместо того, чтобы получать сохраненные данные?





Вы можете использовать $posts = Post::with('comments')->get(), чтобы загружать комментарии к сообщению. Подробнее об этом читайте в документации: https://laravel.com/docs/5.7/eloquent-relationships#eager-loading
Кроме того, чтобы отобразить комментарии, вам нужно добавить еще один цикл foreach. Это выглядело бы примерно так:
@foreach($posts as $post)
{{ $post->title }}
@foreach($post->comments as $comment)
{{ $comment->title }}
@endforeach
@endforeach
Тогда вы можете использовать withCount(). Вот документация: laravel.com/docs/5.7/…
да, ты можешь сделать это в контроллере
$minutes = 60;
$posts = Cache::remember('posts', $minutes, function () {
return Post::with('comments')->get()
});
в лезвии ты можешь получить вот так
@foreach($posts as $post)
{{ $post->title }}
@foreach($post->comments as $comment)
{{ $comment->title }}
@endforeach
@endforeach
для получения дополнительной информации прочтите этот статья
Вы, вероятно, уже кэшировали некоторые данные модели в контроллере раньше, но я собираюсь показать вам метод кэширования моделей Laravel, который более детализирован с использованием моделей Active Record.
Обратите внимание, что мы также можем использовать метод Cache :: RememberForever () и полагаться на сборку мусора нашего механизма кэширования для удаления устаревших ключей. Я установил таймер, чтобы кеш был загружен большую часть времени, а новый кеш обновлялся каждые пятнадцать минут.
Метод cacheKey () должен сделать модель уникальной и аннулировать кеш при обновлении модели. Вот моя реализация cacheKey:
public function cacheKey()
{
return sprintf(
"%s/%s-%s",
$this->getTable(),
$this->getKey(),
$this->updated_at->timestamp
);
}
public function comments()
{
return $this->hasMany(Comment::class);
}
public function getCachedCommentsCountAttribute()
{
return Cache::remember($this->cacheKey() . ':comments_count', 15, function () {
return $this->comments->count();
});
}
Будет ли обновление комментариев (добавление / удаление одного) обновлять столбец «updated_at» в сообщениях?
это будет, когда вы защитите $ touches = ['post']; поставить модель комментариев
Свойство $ touches - это массив, содержащий ассоциацию, которая будет «затронута» при создании, сохранении или удалении комментария.
Еще один вопрос - что делать, если я использую with с разбивкой на страницы? Тогда with нужно просто применить к видимой странице. Я только что протестировал его, и он применим ко всем записям.
Выглядит нормально, но что, если мне нужны какие-то конкретные данные с
with? Например, мне нужны не все комментарии, а только их количество?