【发布时间】:2019-04-26 17:22:11
【问题描述】:
我在课程和项目之间有这种多对多的关系。我可以插入新课程并添加任意数量的程序,并且它可以正确返回。问题出在更新上。我可以检查我的课程更新表单中的所有数据以及通过选中或取消选中复选框选择的所有程序。
我的想法是当我更新课程时,我想删除所有相关的程序(分离())并根据更新表单中检查的程序再次附加。
当我调用 update 方法并调用 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!'
]);
}
我的课程 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: 在整数 {"userId":1,"exception":"[object] (Symfony\Component\Debug\Exception\FatalThrowableError(code: 0) 上调用成员函数programs():调用/Users/GiselleTavares/Documents/.../app/Http/Controllers/CoursesController.php:120 的整数成员函数programs() [堆栈跟踪]
0 [内部函数]:App\Http\Controllers\CoursesController->update(Object(Illuminate\Http\Request), '2')
CoursesController.php:120 的行是:
$course->programs()->detach();
我不明白这个错误是什么意思...
在整数上调用成员函数programs() ...
如果我在下面评论这 3 行,我可以更新课程数据,但当然,程序关系不会发生变化...
$course->programs()->detach();
$program = Program::find($request->programs);
$course->programs()->attach($program);
如果我只注释 detach() 行,则 attach() 行会显示与上面相同的错误。但是,我在我的 store() 上使用完全相同(没有 detach())并且它正在工作。
有什么想法吗?我试图找到解决方案,但没有任何帮助...
【问题讨论】:
-
你使用的是什么版本的 Laravel?
-
@RossWilson 这个:Laravel Framework 5.8.13