Может войдёшь?
Черновики Написать статью Профиль

«Blade»

Eloquent и Blade: советы по повышению производительности

перевод Eloquent blade

Одна из самых распространенных проблем с производительностью, которую я видел в Laravel - это использование методов Eloquent и отношений из шаблонов Blade, создание ненужных дополнительных циклов и запросов. В этой статье я покажу различные сценарии и способы их эффективного использования.

Сценарий 1. Загрузка отношения belongsTo(): не забудьте про «жадную загрузку»

Типичный случай — вы перебираете записи через @foreach, и, в каком-то столбце, вам нужно показать родительскую запись с определенным полем.

@foreach ($sessions as $session)
<tr>
  <td>{{ $session->created_at }}</td>
  <td>{{ $session->user->name }}</td>
</tr>
@endforeach

И, конечно, Session принадлежит User, в app/Session.php :

public function user()
{
    return $this->belongsTo(User::class)…
SeaSnake

По поводу collection vs array, например — https://www.reddit.com/r/laravel/comments/44a2p2/laravel_collection_vs_array_performance/

Логично, что коллекция будет отъедать перфоманс — за удобство приходится платить. Но опять таки, как правильно пишут люди, если вы перебираете коллекцию на миллион записей, у вас что-то неправильно в sql.

По поводу вьюх и моделей мое мнение, что слой БД отдельно, слой представлений отдельно — не должны вьюхи обращаться с БД. Если уж никак не позволяет ситуация разрешить создание данных в контроллере, то значит нужен какой-то компонент (сервис) для вьюх. Но лучше решать это на уровне контроллера, сервисов. В некоторых случаях можно наверное для удобства сделать модели данных (не Eloquent). Вобщем ситуации бывают разные, но вьюха к бд не обращается — неправильная архитектура.

Да и в целом, многие понимают паттерн MVC слишком буквально как по мне. Холивары «тонкий контроллер-толстая модель» и наоборот гремят с неослабевающей силой. Но как по мне, тонкими должны быть оба — single responsibility. А контроллер распределяет логику между сервисами (компонентами), ивентами и пр. частями приложения и отдает уже полученные от них данные в виде переменных во вьюху. Напрямую контроллер у меня не часто «знает» про модель.

Что касается «жадных загрузок», вьюх, Eloquent — вообще если данные будут использоваться в цикле (не только вьюха), то конечно только «жадная». Миллион не миллион, но даже например 500 обращений к БД в цикле — уже караул какой-то (а 500 ведь не предел). Но это понимание наверное придет с практикой, некоторые например запихивают какой-то select в цикл, вместо того чтоб выбрать нужные данные перед циклом и потом копаться уже в массиве или коллекции. Хотя ситуации бывают разные как говорится =)

← Назад | Дальше → Движется на Habravel