如何从相关表中获取所有行,包括数据透视表中的列?

时间:2019-01-24 09:50:01

标签: php laravel eloquent

我有2个表(学生,测试)和数据透视表(student_test)。 从一个特定的学生,我想从测试中获取所有行,包括来自student_test的相关列。如果没有测试结果,则student_test的列的值为NULL。

我试图这样做:

data

我有以下型号。

app / Http / Models / Student.php:

crsr.execute(sql, data)

app / Http / Models / Test.php:

public function all_tests()
{
    $collection = new Collection();

    foreach (Tests::all() as $test) {
        if (($model = $this->tests->find($test->id)) === null) {
            $model = $test;
        }

        $collection->push($model);
    }

    return $collection;
}

我想从student_test表中返回带有额外列(test_result)的Test模型的集合。

3 个答案:

答案 0 :(得分:1)

Laravel仅使用表student_test从测试表或学生表中获取模型,而没有考虑任何额外的列。

我认为您需要一个名为Result的额外模型,该模型与测试具有多对一的关系,而与学生具有一对多的关系

添加带有结果列的模型

  

将此添加到Student模型中

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

将此添加到Test模型中

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

将此添加到Result模型中

public function test()
{
     return $this->belongsTo(Test::class);
}

public function student()
{
     return $this->belongsTo(Student::class);
}

并添加正确的列。

您可以这样做:

$student->results->whereHas('test', function ($query) use ($test) {
    $query->where('id', '=', $test->id);
})->get();

或者:

$test->results->whereHas('student', function ($query) use ($student) {
        $query->where('id', '=', $student->id);
})->get();

答案 1 :(得分:0)

我认为这段代码可以为您提供帮助。 您必须按关系模型使用“ with”

$collection = new Collection();

foreach (Tests::all()->with('tests') as $test) {
    if (($model = $this->tests->find($test->id)) === null) {
        $model = $test;
    }

    $collection->push($model);
}

return $collection; 

答案 2 :(得分:0)

受Mike解决方案的启发,我提出了以下建议:

$student_id = 1;

$test_results = Test::crossJoin('students')
    ->leftJoin('results', [
        ['students.id', '=', 'results.student_id'],
        ['test.id', '=', 'results.test_id'],
    ])
    ->where('students.id', $student_id)
    ->get();