Laravel 5.3 whereIn从现有的集合 - 优化

时间:2017-01-19 20:19:38

标签: php laravel laravel-5 eloquent

我有一个包含测试日期的表(测试)和一个包含每个测试日期(结果)的结果的表。 我首先获得特定运动员/客户的所有测试记录。 然后我需要获得每个测试记录的所有结果。 我只设法让它与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());
        }                    
    }

1 个答案:

答案 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;
}