Laravel ограничивает нетерпеливую загрузку для каждой модели

С нашей моделью User мы с нетерпением ждем загрузки разговоров и сообщений этих разговоров. В каждом разговоре мы хотим вести последние 25 сообщений. Итак, мы написали следующий запрос.

User::where('status', 3)->with(['conversations.messages' => function ($q) {
    $q->take(25)->orderBy('created_at', 'DESC');
}])->get();

Однако эта функция возвращает всего 25 сообщений (то есть не для каждого разговора). Даже если у вас 1000 пользователей, он загрузит последние 25 сообщений в таблицу сообщений, но не последние 25 для каждого разговора пользователя.

Есть ли способ решить эту проблему в рамках методологии Laravel Eloquent?

Возможный дубликат Laravel 5.1 использует ограничение в методе красноречия with ()

thisiskelvin 18.12.2018 17:56

Отвечает ли это на ваш вопрос? Предел функции загрузки Laravel

Hafez Divandari 01.12.2020 12:39
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
2
2
800
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В Laravel для этого нет встроенной поддержки.

Я создал для него пакет: https://github.com/staudenmeir/eloquent-eager-limit

Используйте свойство HasEagerLimit как в родительской, так и в связанной модели.

class Conversation extends Model {
    use \Staudenmeir\EloquentEagerLimit\HasEagerLimit;
}

class Message extends Model {
    use \Staudenmeir\EloquentEagerLimit\HasEagerLimit;
}

Затем просто привяжите вызов ->take(25) к вашему запросу нетерпеливой загрузки (что, кажется, вы уже делаете).

Вы даже можете использовать ->offset(...) и ->skip(...) (подробности см. В файле readme репозитория).

Другие вопросы по теме