У меня много: много отношений между студентом и курсом.
Вот мои модели и моя сводная таблица:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Student extends Model
{
use HasFactory;
protected $fillable = [
'name',
'surname',
'age',
'tdah',
'description',
'hobbies',
];
/* public function course(){
return $this->belongsTo(Course::class);
} */
public function data(){
return $this->hasMany(Datum::class, 'student_id', 'id');
}
public function configurations(){
return $this->hasMany(Configuration::class, 'student_id', 'id');
}
public function courses(){
return $this->belongsToMany(Course::class, 'course_student', 'student_id', 'course_id');
}
}
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Course extends Model
{
use HasFactory;
protected $fillable = [
'name',
'academic_course_id',
'user_id',
];
public function user()
{
return $this->belongsTo(User::class);
}
public function academicCourse()
{
return $this->belongsTo(AcademicCourse::class);
}
public function planification(){
return $this->hasOne(Planification::class, 'course_id', 'id');
}
public function subjects(){
return $this->hasMany(Subject::class, 'course_id', 'id');
}
/* public function students(){
return $this->hasMany(Student::class, 'course_id', 'id');
} */
public function students(){
return $this->belongsToMany(Student::class, 'course_student', 'course_id', 'student_id');
}
}
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('course_student', function (Blueprint $table) {
$table->id();
$table->foreignId('course_id')->constrained()->onDelete('cascade');
$table->foreignId('student_id')->constrained()->onDelete('cascade');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('course_student');
}
};
Я хочу создать студента, принадлежащего к группе. Я знаю, как создать студента и группу, но я хотел бы создать регистрацию для этого студента в сводной таблице course_student. Мое хранилище методов StudentController:
public function store(Request $request)
{
Student::create($request->all());
$courses = Course::all();
$academicCourses = AcademicCourse::all();
return view('course.index', compact('courses', 'academicCourses'));
}
Он создает нового ученика, но я не знаю, как создать новый регистр для сводной таблицы.
Я думал сделать что-то вроде:
course_student::create(request)
в моем методе магазина, но я думаю, что это не так.
$student->courses()->attach($courseId);
https://laravel.com/docs/9.x/eloquent-relationships#updating-many-to-many-relationships
Редактировать :
Вы можете использовать метод attach() для отношений. В вашем коде это будет выглядеть так:
public function store(Request $request, Course $course) //add parameter course to know which course needs to be attached
{
$newStudent = Student::create($request->all()); // create() returns instance of created Student
$newStudent->courses()->attach($course->id);
$courses = Course::all();
$academicCourses = AcademicCourse::all();
return view('course.index', compact('courses', 'academicCourses'));
}
всегда объясняйте свой ответ. Не только путем добавления ссылки (она может измениться в будущем)
Спасибо @StewieSWS за ваш ответ. Я предполагаю, что эта строка создает новый регистр в моей сводной таблице, когда я создаю нового ученика, но я не знаю, где я должен написать эту строку. Спасибо.
@ lewis04 в вашем методе магазина вы проходите все курсы и передаете их в представление. Если я правильно понимаю, в этом представлении вы хотите позволить студенту выбрать курс, верно?
@StewieSWS пройти все курсы — это совсем другое. Что я делаю, так это принимаю запрос, который является новым студентом, и создаю новый регистр в таблице студента. В то же время я хотел бы создать новый регистр в моей таблице course_student с новым студентом и курсом.
@ lewis04 Хорошо, но какой курс? Все они должны быть назначены этому новому студенту?
@StewieSWS не все. Только один курс. Хранилище методов может иметь еще один параметр, который будет курсом. Таким образом, запрос — это новый студент, а другим параметром будет курс, на который должен быть назначен студент.
Хорошо, тогда вам нужно взять идентификатор этого курса, например $course->id, и указать его в качестве параметра в методе attach(). Я отредактирую свой ответ, чтобы показать
@StewieSWS большое спасибо. Я попробую и расскажу вам, как это происходит.
@StewieSWS работает отлично. Это то, что я хотел. Большое спасибо.
В Laravel вы можете сделать это с помощью функции attach, функция Attach() имеет два параметра:
1- другой внешний ключ в вашем случае прикрепляется (course_id).
2-(это необязательно) массив для любых других столбцов внутри сводной таблицы, например:
attach(course_id,['users_id'=>$usersId])
В вашем случае вы будете создавать записи внутри сводной таблицы (course_student) через объект из модели студента.
$student->courses()->attach($course_id);
примечание : есть другой метод, который делает противоположное detach(), но вам нужно использовать его осторожно, если вы напишете его без каких-либо параметров, он удалит все записи внутри (course_student), которые принадлежат объекту студента, поэтому укажите курс, который вы хотите удалить это таким образом:
$student->courses()->detach($course_id);
Я надеюсь, что это поможет вам...
Прежде всего, спасибо @Haro Katsumi за ваш ответ. Я сомневаюсь. Где я должен написать строку: $student->courses()->attach($course_id); ? Потому что я предполагаю, что он создает новый регистр в сводной таблице, когда я создаю нового ученика, но я не знаю, где я должен это написать. Спасибо.
После процесса регистрации для студента @lewis04 добавит курсы, которые он будет посещать, поэтому вам понадобится другой метод, который позволит вам добавить курс для студента, этот метод получит параметр выбранного курса или может получить массив всех курсов, которые принадлежат этому студенту. В случае одного параметра вы будете использовать $student->courses()->attach($course_id);. а в случае с массивом вам понадобится цикл для присоединения студента к каждому курсу в массиве.
Спасибо. Это то, что я сделал, и это работает отлично. @харо катсуми
Вы определили отношение принадлежности ко многим. в этой функции вы можете использовать
$student->courses()->sync([1,2])
, где 1 и 2 - идентификаторы курсов