验证 Laravel 4 中数据库中的“每个用户唯一”行


Validating 'unique per user' rows in database in Laravel 4

我有一个数据库表,看起来像这样:

Schema::create('types', function($table)
{
    $table->increments('id');
    $table->string('label', 128);
    $table->boolean('unique_items');
    $table->integer('user_id')->unsigned();
    $table->foreign('user_id')->references('id')->on('users');
    $table->timestamps();
});

我的验证目前如下所示:

// Validate input for new Type
$validator = Validator::make(Input::all(),
    array(
        'label' => 'required|min:3|max:128|unique:types',
    )
);

我想实现的是用户能够创建一个Type,其中label是他们user_id独有的。因此,如果用户1制作了一个标记为booksType,他无法创建另一个,但是用户2也可以创建一个books类型。

据我从Laravel文档中可以看出,只能从唯一搜索中排除用户,但不能根据他们的id进行比较。有没有办法解决这个问题?

您可以添加额外的 where 子句来使复合唯一项,例如:

"label" => "required|min:3|max:128|unique:types,label,null,id,user_id,{$user_id}"

您只需要在此处传递$user_id,以确保类型仅对此用户是唯一的。您可以在model/Type中声明一个方法,如下所示:

public function setUniqueValidationRuleForType($user_id)
{
    static::$rules["label"] = "required|min:3|max:128|unique:types,label,null,id,user_id,{$user_id}";
    return $this; // This is optional
}

现在,在创建新条目之前,只需调用此方法即可为具有传递给该方法ID的用户提供另一个条目。您也可以在此处查看文档。