首页 文章

Laravel中插入和更新的类别的唯一验证

提问于
浏览
2

我有相关类别的项目列表(表名是: 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中验证具有相关类别的项目以进行插入和更新 .

3 回答

  • 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);
    }),
    
  • 4

    如果您的请求中有 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);
    }
    
  • 0

    创建自定义验证Rule

    php artisan make:rule UniqueCategoryName
    

    并将您的验证规则更改为

    use App\Rules\UniqueCategoryName;
    
    
    'name' => ['required', new UniqueCategoryName($category_id)],
    

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

    <?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;
        }
    
    }
    

相关问题