не хочу редактировать конкретное поле, которое используется в функциях хранения и обновления - PullRequest
1 голос
/ 07 августа 2020

ProductController

public function store()
{
    $product = Product::create($this->validateRequest());

    return redirect('/product');
}

public function update(Product $product)
{
    $product->update($this->validateRequest());

    return redirect('/product');
}

private function validateRequest()
{
    return request()->validate([

        'sub_category_id' => ['required'],

        'name' => ['required', 'min:4'],

        'code' => ['required', 'alpha_dash','unique:products'],

        'description' => ['required', 'min:4'],

        'color' => ['required', 'min:3'],

        'price' => ['required', 'integer'],
    ]);

}

здесь код имеет уникальное значение из таблицы products. но всякий раз, когда я редактирую форму, появляется сообщение, что код уже принят. Итак, как выполнить это, не редактируя «код» (его уникальный).

Ответы [ 3 ]

2 голосов
/ 07 августа 2020

Вы можете игнорировать определенные идентификаторы во время уникальной проверки:

use Illuminate\Validation\Rule;

public function store()
{
    Product::create($this->validateRequest(new Product()));

    return redirect('/product');
}

public function update(Product $product)
{
    $product->update($this->validateRequest($product));

    return redirect('/product');
}

private function validateRequest(Product $product)
{
    return request()->validate([
        'sub_category_id' => ['required'],
        'name' => ['required', 'min:4'],
        'code' => ['required', 'alpha_dash', Rule::unique('products')->ignore($product)],
        'description' => ['required', 'min:4'],
        'color' => ['required', 'min:3'],
        'price' => ['required', 'integer'],
    ]);
}

Здесь вы либо передаете существующую модель при обновлении, либо новый экземпляр модели при сохранении, поэтому вызов $product->id либо возвращает null при сохранении нового продукта, поэтому ни один продукт в базе данных не игнорируется, или идентификатор при обновлении, а затем игнорируется только этот продукт.

Из docs :

Принуждение уникального правила игнорировать данный идентификатор:

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

Чтобы проинструктировать Валидатор игнорирует ID пользователя, мы будем использовать класс Rule, чтобы плавно определить правило. В этом примере мы также укажем правила проверки в виде массива вместо использования | для ограничения правил:

use Illuminate\Validation\Rule;

Validator::make($data, [
    'email' => [
        'required',
        Rule::unique('users')->ignore($user->id),
    ],
]);

Однако имейте в виду следующее:

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

0 голосов
/ 07 августа 2020

Попробуйте этот, правильный и чистый код

ProductController

use Illuminate\Validation\Rule; // add this

public function store()
{
    $product = Product::create($this->validateRequest());

    return redirect('/product'); //use route instead of URL
}

public function update(Product $product)
{
    $product->update($this->validateRequest($product->id));

    return redirect('/product'); //use route instead of URL
}

private function validateRequest($id = null)
{
    return request()->validate([
        'sub_category_id' => 'required',
        'name' => 'required|min:4',
        'code' => 'required|alpha_dash|' . Rule::unique('products')->ignore($id),
        'description' => 'required|min:4',
        'color' => 'required|min:3',
        'price' => 'required|integer',
    ]);
}

Предложите использовать Подтверждение запроса формы

0 голосов
/ 07 августа 2020

Итак, проблема здесь в том, что вы используете одно и то же правило для создания продукта и обновления продукта.

Если вы используете самую последнюю Laravel, вы можете прочитать документацию по запросу формы https://laravel.com/docs/7.x/validation#form -request-validation и создайте запрос другой формы для сохранения и обновления.

Если вы все еще хотите использовать свой способ, вы можете попробовать, как показано ниже

private function validateRequest()
{
    $rules = [
        'sub_category_id' => ['required'],
        'name' => ['required', 'min:4'],
        'description' => ['required', 'min:4'],
        'color' => ['required', 'min:3'],
        'price' => ['required', 'integer'],
    ];
    
    if (request()->isMethod('store')) {
        $rules['code'] = ['required', 'alpha_dash'];
    }

    return request()->validate($rules);
}

Подскажите пожалуйста, работает ли!

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