Php 如果id相同,则Laravel验证唯一性
我有一个表/模型,每个用户包含多个相册。 有没有办法说列Php 如果id相同,则Laravel验证唯一性,php,mysql,validation,laravel,Php,Mysql,Validation,Laravel,我有一个表/模型,每个用户包含多个相册。 有没有办法说列标题应该是唯一的,但只能用于具有相同用户id的行 例如: 正如您在示例中看到的,id为2的用户创建了两个具有相同标题的相册。我不希望这被允许,这就是为什么我想知道是否有一种方法可以通过来自Laravel的验证器来否认这一点 我试过这个,但没用 // Validator $validator = Validator::make($input, [ 'title' => 'required|min:1|max:25
标题
应该是唯一的,但只能用于具有相同用户id的行
例如:
正如您在示例中看到的,id为2的用户创建了两个具有相同标题的相册。我不希望这被允许,这就是为什么我想知道是否有一种方法可以通过来自Laravel的验证器来否认这一点
我试过这个,但没用
// Validator
$validator = Validator::make($input, [
'title' => 'required|min:1|max:255|unique:galleries,title,'. Auth::user() -> id .',user_id',
'description' => 'min:1|max:255'
]);
感谢您的帮助。使用默认的
unique
规则的方法不起作用,因为该规则要求将列值作为第三个参数传递,因此在您的情况下,它将检查title
列是否等于Auth::user()->id
值,这不是您想要的值
您可以通过将以下代码添加到App\Providers\AppServiceProvider
类的boot
方法来创建自己的自定义验证规则:
Validator::extend('unique_custom', function ($attribute, $value, $parameters)
{
// Get the parameters passed to the rule
list($table, $field, $field2, $field2Value) = $parameters;
// Check the table and return true only if there are no entries matching
// both the first field name and the user input value as well as
// the second field name and the second field value
return DB::table($table)->where($field, $value)->where($field2, $field2Value)->count() == 0;
});
现在您可以使用unique\u custom
(或者您可以随意命名)规则如下:
$validator = Validator::make($input, [
'title' => 'required|min:1|max:255|unique_custom:galleries,title,user_id,' . Auth::id(),
'description' => 'min:1|max:255'
]);
规则要求参数如下所示:
- 第一个参数将作为表名,在本例中为
库
- 第二个参数是字段名,该字段名应该是唯一的,其值来自用户输入,在本例中为
标题
- 第三个参数是将添加到查询条件的第二个字段名,在本例中为
user\u id
- 第四个参数是作为第三个参数传递的字段名的值
Auth::id()
,因为这是Auth::user()->id
的缩写形式
您可以在中阅读有关自定义验证规则的更多信息。您的代码应该类似于:
'title' => 'unique:galleries,title,NULL,id,user_id,'.Auth::user() -> id.'',
或者,您可以编写自定义规则
您使用的是什么Laravel版本?我知道了,我目前正在使用5.2ah。谢谢你的解释。也很有魅力,欢迎你。而且,我似乎错误地认为,无法使用默认的
unique
规则来实现这一点。事实上,您可以传递额外的字段
和值
参数作为第二个条件,正如@VipindasKS在中很好地指出的。因此,这在create中可以很好地工作,但是我们应该如何为update函数自定义它?因此,在create中可以很好地工作,但是我们应该如何为update函数自定义它?