Laravel: Почему активная загрузка сохраняет результаты только для последней модели? - PullRequest
0 голосов
/ 27 сентября 2018

Если я выполню следующее:

App\Assignment::with(['unit.records' => function ($q) {
                    $q->where('process_date', '>=', '2016-01-01')
                        ->where('process_date', '<=', '2018-09-27')
                        ->orderBy('process_date')
                        ->orderBy('process_hour')
                        ->limit(1);
                    }])
                    ->whereIn('id', [9])
                    ->get();

Тогда я получу следующий результат:

Illuminate\Database\Eloquent\Collection {#1104
 all: [
   App\Assignment {#1112
     id: 9,
     unit_id: 6,
     start_date: "2015-11-25",
     end_date: "2016-01-04",
     unit: App\Unit {#986
       id: 6,
       records: Illuminate\Database\Eloquent\Collection {#945
         all: [
           App\Record {#853
             id: 6624,
             unit_id: 6,
             process_date: "2017-09-19",
             process_hour: 14,
           },
         ],
       },
     },
   },
 ],
}

Обратите внимание, что у загруженного модуля есть запись, соответствующая запросу.

Теперь, если я использую точно такой же запрос, но добавляю другое присвоение (49) в мой массив whereIn:

App\Assignment::with(['unit.records' => function ($q) {
                    $q->where('process_date', '>=', '2016-01-01')
                        ->where('process_date', '<=', '2018-09-27')
                        ->orderBy('process_date')
                        ->orderBy('process_hour')
                        ->limit(1);
                    }])
                    ->whereIn('id', [9,49])
                    ->get();

Показывается запись для присвоения 49, а запись для присвоения 9 -больше не отображается:

Illuminate\Database\Eloquent\Collection {#1032
 all: [
   App\Assignment {#1014
     id: 9,
     unit_id: 6,
     start_date: "2015-11-25",
     end_date: "2016-01-04",
     unit: App\Unit {#1283
       id: 6,
       records: Illuminate\Database\Eloquent\Collection {#1254
         all: [],
       },
     },
   },
   App\Assignment {#1061
     id: 49,
     unit_id: 29,
     start_date: "2017-02-24",
     end_date: "9999-12-31",
     unit: App\Unit {#1279
       id: 29,
       records: Illuminate\Database\Eloquent\Collection {#1131
         all: [
           App\Record {#1284
             id: 6062,
             unit_id: 29,
             process_date: "2017-03-10",
             process_hour: 13,
           },
         ],
       },
     },
   },
 ],
}

Запись, соответствующая критериям для назначения 9, очевидно, существует, но по какой-то причине она не загружается, когда запрос находит более одного назначения с единицей / записью, котораясоответствует критериям.

Я также проверил это с большим количеством назначений, и в каждом случае запись будет отображаться только для последнего назначения в массиве.

В чем здесь дело?

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

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

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

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

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

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

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

0 голосов
/ 27 сентября 2018

Проблема в том, что вы используете:

->limit(1)

Это ограничивает количество записей отношений до 1. Просто удалите эту строку, и все будет хорошо.

...