Как получить все строки из связанной таблицы, включая столбцы из сводной таблицы? - PullRequest
0 голосов
/ 24 января 2019

У меня есть 2 таблицы (студенты, тесты) и сводная таблица (student_test).От конкретного учащегося я хочу получить все строки из тестов, включая связанные столбцы из student_test.Если результатов теста нет, значения столбцов student_test равны NULL.

Я попытался сделать это так:

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

У меня есть следующие модели.

app / Http / Models / Student.php:

class Student extends Model
{
    protected $table = 'students';

    // Attributes: id, first_name, last_name

    public function tests()
    {
        return $this->belongsToMany(Test::class);
    }
}

app / Http / Models / Test.php:

class Student extends Model
{
    protected $table = 'tests';

    // Attributes: id, name

    public function students()
    {
        return $this->belongsToMany(Student::class);
    }
}

Я хочу вернуть коллекцию тестовых моделей сдополнительный столбец (test_result) из таблицы student_test.

Ответы [ 3 ]

0 голосов
/ 24 января 2019

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();
0 голосов
/ 24 января 2019

Вдохновленный решением Майка, я придумал следующее:

$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();
0 голосов
/ 24 января 2019

Я думаю, что этот код может помочь вам.Вы должны использовать 'с' моделью отношения

$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; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...