Laravel Pivot с несколькими столбцами - PullRequest
0 голосов
/ 26 сентября 2018

Привет У меня проблема с сводной таблицей Laravel.

У меня есть следующие таблицы: студенты, курсы и уроки.

Таблица уроков связана с курсами через внешний ключcourses_id, и таблицы студентов и курсов соединены через сводку courses_students.

Таким образом, я могу получить доступ к информации через студентов следующим образом:

//Students model
public function courses()
{
    return $this->belongsToMany(Courses::class,'courses_students','student_id', 'course_id')
        ->with('lessons');
}

//Courses model
public function lessons()
{
    return $this->hasMany(Lesson::class);
}

Это прекрасно работает для такого рода отношений, но я хочу добавить третий столбец в сводную таблицу с именем lesson_id для таблицы уроков.

Я делаю это потому, что иногда мне нужно получать определенный набор уроков из каждого курса для каждого пользователя.

Мне удалось это сделать, используя модель courseStudent для сводной таблицы.

Используя модель для сводки, мои вызовы стали такими:

Student->with('courseStudent.courses')
    ->with('courseStudent.lessons')
    ->get();

Это частичночто мне нужно для этого, но я хочу поддерживать связь между курсами и студентами.

Есть ли способ достичь этого?

Ответы [ 3 ]

0 голосов
/ 26 сентября 2018

Вы можете использовать соединение для третьего отношения:

public function courses(){
    return $this->belongsToMany(Courses::class,'courses_students','student_id', 'course_id')
    ->withPivot('lesson_id')
    ->join('lessons','lesson_id','=','lessons.id')
    ->select('lessons.id','lessons.title', ...);
}
0 голосов
/ 26 сентября 2018

Если вы собираетесь использовать одну и ту же сводную таблицу для курсов и уроков, вы можете сделать что-то вроде этого:

//Students model

public function courses()
{
    return $this->belongsToMany(Courses::class,'courses_students','student_id', 'course_id')
        ->whereNotNull('course_id');
}


public function lessons()
{
    return $this->belongsToMany(Lessons::class,'courses_students','student_id', 'lesson_id')
        ->whereNotNull('lesson_id');
}

Тогда просто используйте его:

$courses = $student->courses;
$lessons = $student->lessons;
0 голосов
/ 26 сентября 2018

Пример из документов (перейдите от Много ко многим):

return $this->belongsToMany('App\Role')->withPivot('column1', 'column2');

Сводная таблица предназначена для использования отношения belongsToMany на обоих объектах.Поэтому ваши студенты и курсы должны иметь это определение, если вы хотите, чтобы сводная таблица между ними использовала красноречивую емкость по умолчанию.В качестве примечания обратите внимание на соглашение об именах, поскольку таким образом вы уменьшите количество проблем на минимум: сводная таблица должна быть tableanamesingular_tablebnamesingular, где порядок задается в алфавитном порядке имен таблиц (т. Е. post_user Да, user_post Нет).Идентификационные поля в сводной таблице должны быть tablenamesingular_id.Вы можете устанавливать имена по своему усмотрению, но таким образом у вас будет меньше неожиданного поведения в будущем с помощью eloquent.Все это у вас есть на странице документации , и я рекомендую вам пройти через это тщательно.Другой способ - использовать динамические свойства для получения определенных значений.Пример из документации:

$user = App\User::find(1);

foreach ($user->roles as $role) {
    echo $role->pivot->created_at;
}

Если вы хотите вручную изменить значения в сводной таблице, вы должны создать для нее отдельную модель, которая будет связана с этим объектом / таблицей (обратите внимание, что сводная модель расширяет сводную таблицу какнапример из документации, а не из модели):

<?php

namespace App;

use Illuminate\Database\Eloquent\Relations\Pivot;

class PostUser extends Pivot
{
    // other definitions related
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...