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

时间:2014-08-19 05:57:07

标签: php sql validation laravel laravel-4

我有一个如下所示的db表:

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 labeluser_id对于1是唯一的。因此,如果用户Typebooks标记为2,则无法创建另一个,但用户books也可以创建id类型。

据我所知,从Laravel文档中,只能将用户从唯一搜索中排除,但不能根据他们的{{1}}进行比较。有办法解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

您可以添加额外的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的用户的另一个条目。您也可以查看documentation here