我有一个数据库表,看起来像这样:
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
制作了一个标记为books
的Type
,他无法创建另一个,但是用户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
的用户提供另一个条目。您也可以在此处查看文档。