【问题标题】:Laravel 5.3 whereIn from existing collection - optimiseLaravel 5.3 whereIn 来自现有集合 - 优化
【发布时间】:2017-06-04 16:38:03
【问题描述】:

我有一个包含测试日期(测试)的表格和一个包含每个测试日期的结果(结果)的表格。 我首先获取特定运动员/客户的所有测试记录。 然后我需要获取每个测试记录的所有结果。 我只设法让它与一个 foreach 循环一起工作。 1. 有没有更优化的查询结构方式? 2. 对于刀片,按照 test_id 排列数组是否更有条理?在刀片中,我将测试数据显示为标题以及下面每个结果的结果。

下面带有子查询的第一个选项不起作用。 Get a db table not found 错误:

$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());
        }                    
    }

【问题讨论】:

标签: php laravel laravel-5 eloquent


【解决方案1】:

如果您正确定义模型之间的关系,您将能够以更简单、更有效的方式获得结果。

首先,定义关系:

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 模型的测试及其结果:

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

您现在可以通过以下方式访问给定测试的结果:

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

【讨论】:

  • 我的模型设置如上。这很好用,而且非常简单高效。我的控制器功能代码的 80% 现在替换为$athlete_tests = $an_athlete->tests()->with('results')->get(); Blade 部分现在也得到了改进。谢谢
猜你喜欢
  • 1970-01-01
  • 2017-03-17
  • 1970-01-01
  • 2017-05-29
  • 1970-01-01
  • 2020-12-08
  • 2022-01-16
  • 2014-05-10
  • 1970-01-01
相关资源
最近更新 更多