Когда я пытаюсь detach () возвращает ошибку: local.ERROR: вызов функции-члена программы () на целое число - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть отношения «многие ко многим» между курсами и программами.Я могу вставить новые курсы и добавить столько программ, сколько захочу, и он возвращается правильно.Проблема в обновлении.Я могу найти все данные в форме обновления курса и все программы, которые были выбраны с помощью флажков.

Моя идея заключается в том, что при обновлении курса я хочу удалить все связанные программы (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 ()) в моем магазине (), и он работает.

Есть идеи?Я пытался найти решения, но ничего не помогло ...

Ответы [ 2 ]

3 голосов
/ 26 апреля 2019

Функция update() возвращает целое число , указывающее, действительно ли обновление (которое является массовым обновлением, поскольку Course::whereId($id) возвращает набор результатов, а не один).

Это должно работать:

$course = Course::findOrFail($id);

$course->update([
    'name' => $request->name,
    'title' => $request->title,
    'description' => $request->description,
    'is_active' => $request->is_active
]);
0 голосов
/ 26 апреля 2019

Метод update() возвращает значение boolean, поэтому $course не будет моделью, которую вы хотите обновить. Что касается того, почему ошибка говорит integer вместо boolean Я не уверен на 100%.

Есть пара решений, чтобы получить ответ:

  1. Просто используйте find() или findOrFail()

    $course = Course::findOrFail($id);
    
  2. Использование Привязка модели маршрута

    public function update(Request $request, Course $course)
    

При использовании варианта 1 в качестве примера ваш код будет выглядеть примерно так:

public function update(Request $request, $id)
{
    $request->validate([
        'name'  => 'required',
        'title' => 'required',
    ]);

    $course = Course::findOrFail($id);

    $course->update([
        'name'        => $request->name,
        'title'       => $request->title,
        'description' => $request->description,
        'is_active'   => $request->is_active,
    ]);

    $course->programs()->sync($request->input('programs', []));

    return response()->json([
        'course'  => $course,
        'message' => 'Course has been Updated!',
    ]);
}

В приведенном выше примере я использовал sync () вместо отсоединения и присоединения новых идентификаторов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...