如果id相同,Laravel验证唯一

时间:2016-04-12 13:19:47

标签: php mysql validation laravel

我有一个表/模型,每个用户包含多个相册。 有没有办法说列userData.getUserData(function(response) { $scope.uid = response });应该是唯一的,但只适用于具有相同title的行?

示例:http://pastebin.com/8dvM4a1T

正如您在示例中所看到的,ID为2的用户创建了2个具有相同标题的专辑。我不希望这被允许,这就是为什么我想知道是否有办法用Laravel的验证器否认这一点?

我试过这个,但那没用。

user_id

感谢任何帮助,谢谢。

2 个答案:

答案 0 :(得分:6)

使用默认unique规则的方法不起作用,因为规则要求将列值作为第三个参数传递,因此在您的情况下,它将检查title列是否等于Auth::user()->id值不是您想要的值。

您可以通过将以下代码添加到boot类的App\Providers\AppServiceProvider方法来创建自己的自定义验证规则:

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_custom(或者您可以随意命名)规则如下:

$validator = Validator::make($input, [
    'title' => 'required|min:1|max:255|unique_custom:galleries,title,user_id,' . Auth::id(),
    'description' => 'min:1|max:255'
]);

规则要求参数如下:

  • 第一个参数作为表名,在本例中为galleries
  • 第二个参数是一个应该是唯一的字段名称,其值来自用户输入,在本例中为title
  • 第三个参数将成为将添加到查询条件的第二个字段名称,在本例中为user_id
  • 第4个参数是作为第三个参数传递的字段名称的值

此外,您可以使用Auth::id(),因为这是Auth::user()->id的缩写形式。

您可以在Laravel Documentation

中详细了解自定义验证规则

答案 1 :(得分:6)

您的代码应该是:

'title' => 'unique:galleries,title,NULL,id,user_id,'.Auth::user() -> id.'',

或者,您可以编写自定义规则 Reference here