Действительно ли нет способа выполнить limit () в методе with ()? (Красноречивый)

#php #laravel #laravel-5

#php #laravel #laravel-5

Вопрос:

Mode модель имеет hasMany связь с DataSet model. Я хочу загрузить наборы данных с помощью with() -метода. Это работает нормально, если только мне не нужно ограничение на DataSet per Mode . Следующий код работает не так, как ожидалось. Это ограничивает DataSet результаты все вместе, а не по отдельности для каждого Mode .

 $modes = $modes->with(['dataSets' => function ($query) use ($user, $count) {

    // Select data sets of user from each mode

    $query->join('data_set_user', 'id', '=', 'data_set_id')
          ->where('user_id', $user->id);

    if(isset($count))
           $query->limit($count);

 }])->orderBy('order_value')
            ->get();
  

Взгляните на запрос, который выдает этот код:

 SELECT * FROM `data_sets` INNER JOIN `data_set_user` on `id` = `data_set_id` where `data_sets`.`mode_id` in (?, ?, ?) and `user_id` = ? limit 5"
  

Есть ли какой-нибудь Laravel-способ заставить ограничение работать для каждого режима индивидуально?

Ответ №1:

Это невозможно ни с какими методами Laravel.

Это очень сложная проблема, что у некоторых SQLS есть достаточные методы для ее решения, а у других нет.

Проблема поднималась несколько раз:

И, что наиболее заметно (и недавно):

Комментарии:

1. Спасибо, я посмотрю!

2. Штауденмейр, частый сотрудник Laravel и активный в SO, также выпустил пакет , который, похоже, решает эту проблему. Я не пробовал, но вы можете изучить это