Найти данные перед подтверждением запроса формы laravel

Я хочу обновить данные, используя проверку формы запроса с уникальной ролью электронной почты, все работает нормально. Предположим, у меня есть 3 данных с идентификатором 1-3 с URL-адресом:

127.0.0.1:8000/api/user/update/3

Контроллер:

use App\Http\Requests\Simak\User\Update;
...
public function update(Update $request, $id)
{
    try {
        // UPDATE DATA
        return resp(200, trans('general.message.200'), true);
    } catch (\Exception $e) {
        // Ambil error
        return $e;
    }
}

FormRequest «Обновление»:

public function rules()
{
    return [
        'user_akses_id' => 'required|numeric',
        'nama'          => 'required|max:50',
        'email'         => 'required|email|unique:users,email,' . $this->id,
        'password'      => 'required',
        'foto'          => 'nullable|image|max:1024|mimes:jpg,png,jpeg',
        'ip'            => 'nullable|ip',
        'status'        => 'required|boolean'
    ];
}

но если обновленный идентификатор не найден, например:

127.0.0.1:8000/api/user/update/4

В ответ будет The email has already been taken.

Какое решение позволяет не обнаруживать возврат данных вместо проверки в первую очередь?


person Dimas Hayat Pratama    schedule 01.01.2020    source источник
comment
Это должно работать нормально, убедитесь, что $this->id содержит идентификатор, для которого вы обновляете данные.   -  person Satendra Rawat    schedule 01.01.2020


Ответы (2)


Код выглядит так, как будто он должен работать нормально, ниже приведены некоторые вещи, которые могут помочь.

Решение 1. Убедитесь, что $this->id содержит идентификатор, для которого выполняется обновление.

Решение 2. Попробуйте внести следующие изменения, попробуйте получить идентификатор из сегмента URL.

public function rules()
{
    return [
        'user_akses_id' => 'required|numeric',
        'nama'          => 'required|max:50',
        'email'         => 'required|email|unique:users,email,' . $this->segment(4),
        'password'      => 'required',
        'foto'          => 'nullable|image|max:1024|mimes:jpg,png,jpeg',
        'ip'            => 'nullable|ip',
        'status'        => 'required|boolean'
    ];
}

Поделюсь еще одной вещью, которая может вам помочь.

Кто-то использует ключевое слово Request в конце имени запроса. Update звучит универсально и совпадает с именем метода, для которого вы используете запрос. Вы можете использовать UpdateRequest для большей читабельности кода.

person Satendra Rawat    schedule 01.01.2020
comment
Спасибо за ответ. в этом случае метод обновления. все работало нормально, я получил ID. однако проблема заключается не в идентификаторе, а в неоднозначной проверке, потому что, если я отправляю запрос с идентификатором, который недоступен в базе данных, с уже доступным адресом электронной почты, я получаю не журнал «Пользователь не найден», а ответ - это уже использованный адрес электронной почты. потому что он должен проверить, существует ли пользователь с идентификатором или нет, затем проверка электронной почты :) - person Dimas Hayat Pratama; 01.01.2020

Насколько я понимаю из вашего вопроса, вам нужен способ проверить, действительно ли существует запись в запросе формы. В этом случае создайте настраиваемое правило, которое будет проверять, существует ли запись или нет, и использовать это правило в вашем запросе.

CheckRecordRule

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class CheckRecordRule implements Rule
{
   protected $recordId;

   public function __construct($id)
   {
       $this->recordId = $id;
   }

   public function passes($attribute, $value)
   {
       // this will check and return true/false
       return User::where('id', $this->recordId)->exists();
   }

   public function message()
   {
       return 'Record not found.';
   }
}

Запрос на обновление формы

public function rules()
{
    return [
        'email' => 'required|email|unique:users,email,' . $this->id.'|'. new CheckRecordRule($this->id),
    ];
}

Поэтому при проверке дублирования он также проверит, действительно ли существует запись или нет, а затем перенаправит обратно с правильным сообщением.

person Hammad Rasheed    schedule 01.01.2020