Laravel 5.3, откуда в существующей коллекции — оптимизировать

У меня есть таблица с датами испытаний (Test) и таблица с результатами для каждой из этих дат испытаний (Results).
Сначала я получаю все записи испытаний для конкретного спортсмена / клиента.
Затем мне нужно получить все результаты для каждой из этих записей испытаний.
Мне только удается заставить это работать с циклом foreach.
1. Есть ли более оптимальный способ структурировать запрос?
2. Для blade, возможно, более структурировано, чтобы упорядочить массив в соответствии с test_id? В блейде я отображаю тестовые данные в виде заголовков и результаты для каждого из них внизу.

Первый вариант ниже с подзапросом не работает. Получить ошибку в таблице базы данных не найдено:

$athlete_tests = Test::where('athlete_id', $an_athlete->id)->get();
if($athlete_tests){
$results = Result::whereIn('test_id', function($query) use ($an_athlete){
$query->select('test_id')
->from('Test')
->where('athlete_id', $an_athlete->id);
})->get();
}

Этот работает — должен быть оптимизирован:

$athlete_tests = Test::where('athlete_id', $an_athlete->id)->get();
if($athlete_tests){
$results = collect([]);

foreach ($athlete_tests as $key => $value) {
$results = $results->merge(Result::where('test_id', $value->id)->get());
}
}

0

Решение

Если вы правильно определите отношения между вашими моделями, вы сможете получить результаты гораздо проще и эффективнее.

Сначала определим отношения:

class Athlete extends Model {
public function tests() {
return $this->hasMany(Test::class);
}
}

class Test extends Model {
public function athlete() {
return $this->belongsTo(Athlete::class);
}

public function results() {
return $this->hasMany(Result::class);
}
}

Теперь вы сможете получить тесты и их результаты для данного спортсмен модель с:

$athlete_tests = $an_athlete->tests()->with('results')->get();

Теперь вы можете получить доступ к результатам данного теста с помощью:

foreach ($athlete_tests as $test) {
$results = $test->results;
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector