【问题标题】:Unique validation with category for insert and update in Laravel在 Laravel 中使用类别进行唯一验证以插入和更新
【发布时间】:2018-07-15 05:40:32
【问题描述】:

我有相关类别的项目列表(表名是:items

--- id ------ category_id ----- name
--- 1 ------- 1 ---------------- aa  --> Valid
--- 2 ------- 1 ---------------- bb  --> Valid
--- 3 ------- 2 ---------------- aa  --> Valid
--- 4 ------- 2 ---------------- bb  --> Valid
--- 5 ------- 1 ---------------- aa  --> InValid because same name exist in same category
--- 6 ------- 2 ---------------- bb  --> InValid because same name exist in same category

Laravel documention

唯一规则在这里不起作用,因为它会验证所有记录的name

public function validateItems($requestAll){
    $id = isset($requestAll['id']) ? ','.$requestAll['id'].',id':'';
    $rules = [
        'name' => 'required|unique:items,name'.$id,
        'category' => 'required'
    ];
    return Validator::make($requestAll, $rules);
}

如何验证具有相关类别的项目以在 Laravel 中插入和更新。

【问题讨论】:

  • 看看 github 中提供的这种方式。 github.com/felixkiss/uniquewith-validator这可能会帮助您提供一个很好的例子:D
  • @SagarGautam :上面写着Documentation for older versions,对于类似类别/额外的列,我在这里没有找到任何线索。谢谢
  • 没关系,恭喜你已经得到解决方案了:D

标签: php laravel laravel-5 laravel-validation


【解决方案1】:

我认为你需要类似的东西

'name' => Rule::unique('items')->where(function ($query) use ($categoryId) {
    return $query->where('category_id', $categoryId);
}),

UPD:用于更新现有行:

'name' => Rule::unique('items')->ignore($existingRecordId)->where(function ($query) use ($categoryId) {
    return $query->where('category_id', $categoryId);
}),

【讨论】:

  • 感谢回复,这里如何排除id?我的意思是它适用于插入和更新两者吗?
  • @user2486 请检查更新的答案。希望这会奏效
  • 哇,我想,现在它可以工作了,非常感谢,我为此花了 1/2 小时。
  • 请在您的问题中添加此链接以供参考:laravel.com/api/5.5/Illuminate/Validation/Rules/Unique.html
【解决方案2】:

创建自定义验证Rule

php artisan make:rule UniqueCategoryName

并将您的验证规则更改为

use App\Rules\UniqueCategoryName;


'name' => ['required', new UniqueCategoryName($category_id)],

在规则的passes方法中,对表进行验证

<?php

namespace App\Rules;

use App\Item;
use Illuminate\Contracts\Validation\Rule;

class UniqueCategoryName implements Rule
{

    protected $category_id;

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

    public function passes($attribute, $value)
    {
        $items = Item::where([
                       ['category_id', $this->category_id],
                       ['name', $value]
                 ])->get();

        if ($items->count()) {
            return false;
        }

        return true;
    }

}

【讨论】:

    【解决方案3】:

    如果您的请求中有category_id,那么这可以工作。

    public function validateItems($requestAll){
       $id = isset($requestAll['id']) ? $requestAll['id'] : 'NULL'; //with PHP7 it could be $id = $requestAll['id'] ?? 'NULL';
       $categoryId = $requestAll['category_id']; //i don't know if it exists in your request.
       $rules = [
          'name' => 'required|unique:items,name,'.$id.',id,category_id,'.$categoryId,
          'category' => 'required'
       ];
       return Validator::make($requestAll, $rules);
    }
    

    【讨论】:

    • 可能是一些错字。它是抛出任何错误还是只是不工作?我在我的项目上使用的完全一样,并且可以正常工作。我的更新验证示例 - unique:users,email,' 。 $id 。 ',id,organization_id,' 。 $request->organization_id,
    猜你喜欢
    • 2022-01-12
    • 2014-08-20
    • 1970-01-01
    • 2018-07-17
    • 2014-06-28
    • 2016-08-01
    • 2018-08-09
    • 2019-02-26
    • 2016-04-15
    相关资源
    最近更新 更多