С нашей моделью 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






В 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 репозитория).
Возможный дубликат Laravel 5.1 использует ограничение в методе красноречия with ()