У меня есть отношения «многие ко многим» между курсами и программами.Я могу вставить новые курсы и добавить столько программ, сколько захочу, и он возвращается правильно.Проблема в обновлении.Я могу найти все данные в форме обновления курса и все программы, которые были выбраны с помощью флажков.
Моя идея заключается в том, что при обновлении курса я хочу удалить все связанные программы (detach ()) иподключите снова в соответствии с программами, отмеченными в форме обновления.
Проблема возникает, когда я вызываю метод обновления и он вызывает detach ().
Мои модели:
Курс (модель):
class Course extends Model
{
protected $fillable = [
'name', 'title', 'description', 'is_active'
];
public function programs(){
return $this->belongsToMany(Program::class)->withTimestamps();
}
}
Программа (модель):
class Program extends Model
{
protected $fillable = [
'name', 'description', 'is_active'
];
public function courses(){
return $this->belongsToMany(Course::class)->withTimestamps();
}
}
Мое обновление на CoursesController:
public function update(Request $request, $id)
{
$request->validate([
'name' => 'required',
'title' => 'required'
]);
// $course = Course::whereId($id)->update($request->all());
$course = Course::whereId($id)->update([
'name' => $request->name,
'title' => $request->title,
'description' => $request->description,
'is_active' => $request->is_active
]);
$course->programs()->detach();
$program = Program::find($request->programs);
$course->programs()->attach($program);
return response()->json([
'course' => $course,
'message' => 'Course has been Updated!'
]);
}
мой компонент Course Vuejs:
<template>
...
</template>
<script>
export default {
data(){
return {
course:{
name: '',
title: '',
description: '',
is_active: true,
programs: []
},
courses: [],
uri: 'http://127.0.0.1:8000/courses/',
errors: [],
new_update_course: [],
toastr: toastr.options = {"positionClass": "toast-top-full-width"},
programs: [],
uriPrograms: 'http://127.0.0.1:8000/activePrograms/',
}
},
methods: {
...
loadUpdateCourseModal(index){
this.errors = [];
$("#update-course-modal").modal("show");
this.new_update_course = this.courses[index];
this.new_update_course.programs.forEach(program => {
this.new_update_course.programs.push(program.id)
});
},
...
updateCourse(){
axios.patch(this.uri + this.new_update_course.id, {
name: this.new_update_course.name,
title: this.new_update_course.title,
description: this.new_update_course.description,
is_active: this.new_update_course.is_active,
programs: this.new_update_course.programs
}).then(response =>{
$("#update-course-modal").modal("hide");
toastr.success(response.data.message);
}).catch(error=>{
if(error.response.data.errors.name){
this.errors.push(error.response.data.errors.name[0]);
}
if(error.response.data.errors.title){
this.errors.push(error.response.data.errors.title[0]);
}
if(error.response.data.errors.description){
this.errors.push(error.response.data.errors.description[0]);
}
});
},
...
},
mounted(){
...
}
}
</script>
Если я пытаюсь обновитькурс с id = 2, например, в моем журнале laravel, ошибка:
local.ERROR: вызов функции-члена program () для целого числа {"userId": 1, "исключение ":" [объект] (Symfony \ Component \ Debug \ Exception \ FatalThrowableError (код: 0): вызов функции-члена программы () для целого числа в /Users/GiselleTavares/Documents/.../app/Http/Controllers/CoursesController.php:120) [stacktrace]
0 [внутренняя функция]: App \ Http \ Controllers \ CoursesController-> update (Object (Illuminate \ Http \ Request), '2')
Строка для CoursesController.php: 120:
$course->programs()->detach();
Я не понимаю, что означает эта ошибка ...
Вызов функции членадля программ () на целое число ...
Если я прокомментирую эти 3 строки ниже, я могу обновить данные курса, но, конечно, без изменений в отношении Программ ...
$course->programs()->detach();
$program = Program::find($request->programs);
$course->programs()->attach($program);
Если я прокомментирую только строку detach (), строка attach () покажет ту же ошибку выше.Тем не менее, я использую то же самое (без detach ()) в моем магазине (), и он работает.
Есть идеи?Я пытался найти решения, но ничего не помогло ...