'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;
6年前 评论

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

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

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

7年前 评论
liyu001989

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

7年前 评论

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

'email' => Rule::unique('users')->ignore($user->id, 'user_id')
6年前 评论
  • 这一个验证规则,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;
6年前 评论