'exists:images,id,type,avatar,user_id,'.$userId 的参数含义?

请问一下'exists:images,id,type,avatar,user_id,'.$userId
这一句的参数含义百度没找到呢
我理解是判断模型images中id字段是否存在,后面的理解不了,啥意思?

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 4
  • 这一个验证规则,5.7的文档中是没有的,看了半天。。把源码分析了一下。。trace如下即可:
    Illuminate\Validation\DatabasePresenceVerifier->addConditions()
    Illuminate\Validation\DatabasePresenceVerifier->getCount()
    Illuminate\Validation\Validator->getExistCount()
    Illuminate\Validation\Validator->validateExists()
    Illuminate\Validation\Validator->validateAttribute()
  • 通过分析源码,可以得知规则中的:号后都是参数,而从下标为2开始都是extra parameters

    protected function getExistCount($connection, $table, $column, $value, $parameters)
    {
        $verifier = $this->getPresenceVerifierFor($connection);
    
        $extra = $this->getExtraConditions(
            array_values(array_slice($parameters, 2)) //就是这里!
        );
    
        if ($this->currentRule instanceof Exists) {
            $extra = array_merge($extra, $this->currentRule->queryCallbacks());
        }
    
        return is_array($value)
                ? $verifier->getMultiCount($table, $column, $value, $extra)
                : $verifier->getCount($table, $column, $value, null, null, $extra);
    }
  • 上面这个写法是在5.3之前才有的了,如果一开始就知道这个,肯定就不用去看源码了。。悲催啊。。。
  • 5.3开始的规则写法已经变得更加语义化。
  • 按照5.7中的写法,这个规则可以改写如下:
    case 'PATCH':
        $userId = Auth::guard('api')->id();
        return [
            'name' => 'between:3,25|regex:/^[A-Za-z0-9\-\_]+$/|unique:users,name,' .$userId,
            'email' => 'email',
            'introduction' => 'max:80',
            //'avatar_image_id' => 'exists:images,id,type,avatar,user_id,'.$userId,
            'avatar_image_id' => [
                Rule::exists('images', 'id')->where(function ($query) use ($userId) {
                    $query->where('type', 'avatar')->where('user_id', $userId);
                    //or
                    $query->where([
                        ['type', '=', 'avatar'],
                        ['user_id', '=', $userId]
                    ]);
                }),
            ]
        ];
        break;
5年前 评论

@liyu001989 教程中的exists写法,包括前面的 unique 的忽略字段写法好像都是laravel 5.1版本的写法吧,我感觉这种写法的语义性太差了,laravel 5.5中好像已经修改了写法:

'email' => Rule::unique('users')->ignore($user->id, 'user_id')
5年前 评论
liyu001989

exists:images,id,type,avatar,user_id,'.$userId images 表中id是否存在,type 是否为 avatar,用户id是否是当前登录的用户id

6年前 评论
liyu001989

exists:images,id,type,avatar,user_id,'.$userId images 表中id是否存在,type 是否为 avatar,用户id是否是当前登录的用户id

6年前 评论

@liyu001989 教程中的exists写法,包括前面的 unique 的忽略字段写法好像都是laravel 5.1版本的写法吧,我感觉这种写法的语义性太差了,laravel 5.5中好像已经修改了写法:

'email' => Rule::unique('users')->ignore($user->id, 'user_id')
5年前 评论
  • 这一个验证规则,5.7的文档中是没有的,看了半天。。把源码分析了一下。。trace如下即可:
    Illuminate\Validation\DatabasePresenceVerifier->addConditions()
    Illuminate\Validation\DatabasePresenceVerifier->getCount()
    Illuminate\Validation\Validator->getExistCount()
    Illuminate\Validation\Validator->validateExists()
    Illuminate\Validation\Validator->validateAttribute()
  • 通过分析源码,可以得知规则中的:号后都是参数,而从下标为2开始都是extra parameters

    protected function getExistCount($connection, $table, $column, $value, $parameters)
    {
        $verifier = $this->getPresenceVerifierFor($connection);
    
        $extra = $this->getExtraConditions(
            array_values(array_slice($parameters, 2)) //就是这里!
        );
    
        if ($this->currentRule instanceof Exists) {
            $extra = array_merge($extra, $this->currentRule->queryCallbacks());
        }
    
        return is_array($value)
                ? $verifier->getMultiCount($table, $column, $value, $extra)
                : $verifier->getCount($table, $column, $value, null, null, $extra);
    }
  • 上面这个写法是在5.3之前才有的了,如果一开始就知道这个,肯定就不用去看源码了。。悲催啊。。。
  • 5.3开始的规则写法已经变得更加语义化。
  • 按照5.7中的写法,这个规则可以改写如下:
    case 'PATCH':
        $userId = Auth::guard('api')->id();
        return [
            'name' => 'between:3,25|regex:/^[A-Za-z0-9\-\_]+$/|unique:users,name,' .$userId,
            'email' => 'email',
            'introduction' => 'max:80',
            //'avatar_image_id' => 'exists:images,id,type,avatar,user_id,'.$userId,
            'avatar_image_id' => [
                Rule::exists('images', 'id')->where(function ($query) use ($userId) {
                    $query->where('type', 'avatar')->where('user_id', $userId);
                    //or
                    $query->where([
                        ['type', '=', 'avatar'],
                        ['user_id', '=', $userId]
                    ]);
                }),
            ]
        ];
        break;
5年前 评论

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