我有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模型的集合。
答案 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();