Laravel 验证是否有重复数据的问题

本人接触Laravel时间不长,在实现收藏功能的时候遇到一个小问题,如何验证自己是否重复收藏了?
表结构:

Schema::create('favors', function (Blueprint $table) {
            $table->increments('id')->comment('收藏id');
            $table->integer('userid')->notNULL()->comment('收藏人ID')->index();
            $table->integer('section')->notNULL()->comment('收藏章节id')->index();
            $table->integer('question')->notNULL()->comment('收藏题目id')->index();
            $table->timestamps();
        });

这个是一个试题收藏的表结构,如果同一个 收藏人ID 收藏的 题目id 重复了,那就验证不通过,用sql表示就是:

$result=Favors::where('userid',$request->user()->id)->where('question',$request->question)->first() ? '重复' : '第一次收藏';

在表单验证中,我看到 unique:table,column,except,idColumn 可以很简单的实现 数据是否重复,不知道这个规则该如何写?
下面是我之前写的一个 用户修改资料的时候的一个表单验证,这种只能是排除自己

    protected function validateUser(Request $request)
    {
        $request->validate([
            'username' => 'required|min:2|max:10',
            'mobile'   => 'regex:/^1[345789][0-9]{9}$/|unique:users,mobile,' . $request->user()->id,
            'sex'      => 'required',
        ]);
    }

另外前面还考虑 通过关联模型,隐藏收藏按钮 也是一个方法,但是考虑到收藏功能不常用,没必要在用户不使用收藏功能的时候 也要查询数据,所以最好的办法是 当用户使用收藏功能时,只要返回给他一个 重复收藏的消息 就可以。

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
岁月流沙
最佳答案

规则可以像sql一样写:

protected function validateUser(Request $request)
    {
        $request->validate([
            'question' => [
                'required',
                Rule::unique('favors')->where(function($query) use ($request) {
                    return $query->where('userid', $request->user()->id)->where('question', $request->question);
                });
            ],
        ]);
    }
3年前 评论
callback (楼主) 3年前
讨论数量: 4

Rule::unique 吧,,,这个字符串的形式,写长了,有点难看出啥意思,,,

3年前 评论
callback (楼主) 3年前

你可能误解了表单验证的用途,表单验证是验证$request的参数符不符合一个特定的需求,这个跟数据库是没有交互的

而你想要验证是否重复收藏是“必须”要查询数据库的

所以你在上面提到的解决方法思路是对的

3年前 评论
callback (楼主) 3年前
岁月流沙

规则可以像sql一样写:

protected function validateUser(Request $request)
    {
        $request->validate([
            'question' => [
                'required',
                Rule::unique('favors')->where(function($query) use ($request) {
                    return $query->where('userid', $request->user()->id)->where('question', $request->question);
                });
            ],
        ]);
    }
3年前 评论
callback (楼主) 3年前

收藏重复就不收藏,没收藏就插入数据库?你要完成这个功能吗?

3年前 评论
callback (楼主) 3年前
super_duan (作者) 3年前
callback (楼主) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!