Неправильно обновить всю запись после вызова функции - PullRequest
2 голосов
/ 05 ноября 2019

Я создаю функцию редактирования, которая может редактировать заголовок сообщения. На самом деле, он может успешно обновлять записи, но он обновляет заголовок всех сообщений, когда я просто редактирую одну из них. Когда я отправляю запрос на редактирование, он сразу изменяет все сообщения.

Проект находится под Php Laravel и использует sqlite для управления базой данных.

PostsController.php

public function update(Post $post){
    auth();
    $userid = auth()->user()->id;
    $postuid = $post->user_id;

    if ($postuid == $userid) {
        $data = request()->validate([
            'caption' => 'required',
        ]);

        auth()->user()->posts()->update($data);

        return redirect("/p/{$post->id}");
    }else return abort('403');
}

Create_posts_table.php

Schema::create('posts', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->unsignedBigInteger('user_id');
        $table->text('caption');
        $table->string('image');
        $table->timestamps();

        $table->index('user_id');
});

create_user_table.php

Schema::create('users', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('name');
        $table->string('email')->unique();
        $table->string('username')->unique();
        $table->timestamp('email_verified_at')->nullable();
        $table->string('password');
        $table->rememberToken();
        $table->timestamps();
});

Ожидается: он обновляет каждую запись, если я получаю доступ к ее странице редактирования. Факт: откройте одну из страниц редактирования и обновите все записи сразу.

Ответы [ 3 ]

3 голосов
/ 05 ноября 2019

auth()->user()->posts()->update($data); собирается обновить все posts(), которые связаны с текущим auth()->user(). Если вы хотите обновить только текущую Post, просто выполните

$post->update($data);

Привязка модели маршрута, через Post $post в вашей функции вы найдете экземпляр Post, связанный с идентификатором в URL, поэтомуВы можете просто обновить это.

2 голосов
/ 05 ноября 2019

Сделайте так:

public function update(Post $post){
    auth();
    $userid = auth()->user()->id;
    $postuid = $post->user_id;

    if ($postuid == $userid) {
        $data = request()->validate([
            'caption' => 'required',
        ]);

        // update only the specific post, not all posts belonging to user
        $post->update($data);

        return redirect("/p/{$post->id}");
    }else return abort('403');
}
0 голосов
/ 05 ноября 2019

Вы не должны использовать метод update без некоторой безопасности.

Первое правило в dev - никогда не доверять вводу клиента. Например, если запрос содержит ввод user_id, имеющий значение, отличное от идентификатора текущего пользователя, ваш код изменит владельца сообщения.

В этом случае нет чувствительных полей, кроме. ..

Вот хороший пример (поясню в коде):

public function update($postId){ //remove model injection and use the post ID.

    //validate data you can use FormRequest class extention in the method parameters instead
    $data = request()->validate([
        'caption' => 'required',
        'not_required_field' => 'string',
    ]);

    //get the post from the relation of the user, if the post doesnt exist or is not the user's post, it will return a 404 response.
    $user = auth()->user();
    $post = $user->posts()->findOrFail($postId);

    //get the data one variable at a time it's more safe. The input method second parameter is the default to set
    $caption = request()->input('caption');
    $notRequiredField = request()->input('not_required_field', '');

    //now you can update
    $post->caption = $caption;
    $post->not_required_field = $notRequiredField;
    $post->save();

    //result of success
    return redirect("/p/{$post->id}");
}

Не забудьте изменить {$post} на {$postId} в маршруте.

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