Php 在Laravel中使用插入和更新类别进行唯一验证

Php 在Laravel中使用插入和更新类别进行唯一验证,php,laravel,laravel-5,laravel-validation,Php,Laravel,Laravel 5,Laravel Validation,我有相关类别的项目列表(表名为:项目) 如 唯一规则在这里不起作用,因为对于类别而言,它会验证所有记录的name public function validateItems($requestAll){ $id = isset($requestAll['id']) ? ','.$requestAll['id'].',id':''; $rules = [ 'name' => 'required|unique:items,name'.$id, '

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


唯一规则在这里不起作用,因为对于类别而言,它会验证所有记录的
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中插入和更新。

我认为您需要

'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);
}),
创建自定义验证

并将验证规则更改为

use App\Rules\UniqueCategoryName;


'name' => ['required', new UniqueCategoryName($category_id)],
在规则的passs方法中,对表进行验证

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

}

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

谢谢回复,这里如何排除
id
?我的意思是,插入和更新这两种方法都有效吗?@user2486请检查更新的答案。希望这能起作用哇,我想,现在它能起作用了,非常感谢,我为此花了1/2个小时。请在您的问题中添加此链接以供参考:看看github中提供的这种方式。这可能会对您有所帮助。我们还提供了一个很好的示例:D@SagarGautam:上面写着旧版本的
文档
和类似类别/额外列,我在这里找不到任何线索。谢谢没关系,你已经有了解决方案恭喜:D可能是一些打字错误。它是否抛出了任何错误或只是不起作用?我在我的项目中使用的是完全相同的,而且它是有效的。我的更新验证示例-唯一:用户、电子邮件'$身份证,身份证,组织机构身份证'$请求->组织\u id,
<?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;
    }

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