@photosho

Как правильно передавать данные отображению?

Здравствуйте. Допустим, нужно отобразить список всех статей блога. Создаю действие контроллера:

$posts = Post::all()->toArray();
return view('posts', ['posts' => $posts]);


И далее, в отображении, через "foreach" вывожу список статей.

Но в документации по Eloquent указано, что если элементов слишком много, простой "foreach" может потратить всю оперативную память на их обход. Предлагают использовать такой код:

User::chunk(200, function($users) {
    foreach ($users as $user) {
        //
    }
});


Каким образом использовать метод "chunk" в отображении, если, как я понимаю, оно должно быть полностью отвязано от модели? То есть, "chunk" - это метод модели "Post", но написать в отображении use App\Post; и использовать методы модели - вряд ли правильное решение.
  • Вопрос задан
  • 154 просмотра
Решения вопроса 1
alexey-m-ukolov
@alexey-m-ukolov Куратор тега Laravel
Лично я не вижу ничего плохого в использовании объектов во View. Что вы выигрываете от того, что приводите объект к массиву? Отвязываете шаблон от модели? Довольно сомнительный преимущества, а проблемы налицо.

Очень подробное обсуждение есть здесь.

Отвечая на ваш вопрос, должно быть так:
$posts = Post::all();
return view('posts', ['posts' => $posts]);

$posts->chunk(200, function($chunk) {
    foreach ($chunk as $post) {
        //
    }
});


А уж если делать совсем правильно, то не надо выводить всё на одной странице и использовать пагинацию. Тогда и проблема с памятью решится сама собой.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Denormalization
@Denormalization
На самом деле проблема надумана.
Какую цель вы ставите выводя на странице > 200 объектов?
Почему просто не использовать paginate метод и сделать пагинацию результатов? Тогда не будет никаких проблем с over9000 объектов на странице.
Ответ написан
Комментировать
DJZT
@DJZT
Laravel - code for you
Выводил по 500 пользователей на страницу с 8ю полями, 3 из которых являются отношениями. (Роль, Группа, Колв-во постов), но при это в контроллере использовал метод User->with('role') и ничего не заметил. Лимит в PHP стоит 384Мб
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы