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