如何针对特定用户避免数据库重复记录:以食谱名称校验为例
实现同一用户下食谱名称唯一的解决方案
要实现仅限制同一用户不可创建同名食谱、允许不同用户使用相同食谱名称的需求,我们可以从请求校验和数据库约束两层做处理,避免脏数据入库:
1. 调整表单校验规则
你之前使用的'required|unique:recipes, name'规则会校验整个recipes表的name字段全局唯一,不符合允许不同用户使用相同食谱名称的需求,因此我们需要用Rule类自定义unique规则,追加当前登录用户ID作为过滤条件:
$request->validate([ 'name' => [ 'required', \Illuminate\Validation\Rule::unique('recipes', 'name') ->where('user_id', auth()->id()) ] ]);
如果是更新已有食谱的场景,还需要排除当前被更新的食谱ID,避免自己和自己查重导致校验失败:
$request->validate([ 'name' => [ 'required', \Illuminate\Validation\Rule::unique('recipes', 'name') ->where('user_id', auth()->id()) ->ignore($recipe->id) ] ]);
2. 数据库层加联合唯一索引
为了避免业务逻辑出现疏漏导致脏数据入库,建议直接给recipes表加user_id和name的联合唯一索引,迁移文件写法如下:
Schema::table('recipes', function (Blueprint $table) { $table->unique(['user_id', 'name']); });
两层校验搭配使用,就可以完全保证同一用户下不会出现重复的食谱名称,同时不限制不同用户使用相同的食谱名。
内容的提问来源于stack exchange,提问作者Phillip Zoghbi
相关产品推荐
相关产品推荐

