Способ, которым вы пытаетесь получить доступ к связанным записям в цикле, может создать N + 1 проблему
Согласно официальным документам При доступе к отношениям Eloquent в качестве свойств данные отношений «загружаются лениво». Это означает, что данные отношения фактически не загружаются, пока вы не получите первый доступ к свойству. Однако Eloquent может «загружать» отношения во время запроса родительской модели. Стремительная загрузка облегчает проблему запроса N + 1
Вы можете загрузить соответствующие данные как
$results = ParentModel::with('records')
->where(...) /* If there are any filters for ParentModel */
->get();
Для быстрой загрузки будет выполнено только 2 запроса, чтобы получить ваши данные для основной модели и связанной модели. Каждая строка в $results
будет представлять собой набор связанных записей, которые вы можете перебирать, чтобы перечислять детали каждого связанного объекта.
Чтобы получить отфильтрованные строки связанной модели, вы можете изменить метод with()
как
$results = ParentModel::with(['records' => function ($query) {
$query->where('status','=','success');
}])
->where(...) /* If there are any filters for ParentModel */
->get();
Чтобы получить отфильтрованные строки ParentModel на основе связанных записей, вы можете использовать whereHas
$results = ParentModel::with('records')
->where(...) /* If there are any filters for ParentModel */
->whereHas('records', function ($query) {
$query->where('status','=','success');
})->get();