我有一个包含测试日期的表(测试)和一个包含每个测试日期(结果)的结果的表。 我首先获得特定运动员/客户的所有测试记录。 然后我需要获得每个测试记录的所有结果。 我只设法让它与foreach循环一起工作。 1.是否有更优化的方式来构建查询? 2.对于刀片,是否可以更加结构化以按test_id排序数组?在刀片中,我将测试数据显示为标题,并显示每个下面的结果。
下面带有子查询的第一个选项不起作用。找不到db表错误:
$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 :(得分:2)
如果您正确定义模型之间的关系,您将能够以更简单,更有效的方式获得结果。
首先,定义关系:
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;
}