【问题标题】:Validating 'unique per user' rows in database in Laravel 4在 Laravel 4 中验证数据库中的“每个用户唯一”行
【发布时间】:2014-10-12 03:33:33
【问题描述】:

我有一个如下所示的 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,其中label 是他们的user_id 独有的。因此,如果用户 1 创建一个标记为 booksType 他不能创建另一个,但是用户 2 也可以创建一个 books 类型。

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

【问题讨论】:

    标签: php sql validation laravel laravel-4


    【解决方案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

    【讨论】:

    • 谢谢!你能解释一下null,id,user_id 代表什么吗?文档似乎有点含糊,我仍然不明白为什么这样做/如何构造查询。
    • 这将生成如下查询:select count(*) as aggregate from types` 其中label = 'some_value' 和user_id = $user_id. The NULL` 和ID 用于更新以允许传递的id 进行编辑。
    猜你喜欢
    • 2014-03-14
    • 2021-03-08
    • 2018-10-01
    • 2013-06-03
    • 2015-02-03
    • 2014-08-08
    • 2017-11-02
    • 2021-10-15
    • 2018-12-26
    相关资源
    最近更新 更多