think-validate icon indicating copy to clipboard operation
think-validate copied to clipboard

unique复杂验证是不是不对

Open runphp opened this issue 9 months ago • 1 comments

https://github.com/top-think/think-validate/blob/f7dd85675270e9f8c0b04a13362133067629f53c/src/Validate.php#L1484

Image

图片展示的是查询UserAddress用户的地址是否存在,我这里是用unique实现的,

规则'address_id' => 'require|exist:'.UserAddress::class.',id=address_id&uid=uid'

我现在这样写的查询是

SELECT `id` FROM `eb_user_address` WHERE  (  `id` = address_id  AND `uid` = 14 ) LIMIT 1

其实期望得到应该是 ```sql SELECT id FROM eb_user_address WHERE ( id = 2 AND uid = 14 ) LIMIT 1


所以
```php

// 支持复杂验证
            parse_str($key, $array);
            foreach ($array as $k => $val) {
                $map[] = [$k, '=', $data[$k] ?? $val];
            }

//  这里的$data[$k] 是不是应该 $data[$val] 更合适一些

runphp avatar Apr 04 '25 01:04 runphp

我现在的代码需要这样实现

class OrderValidate extends Validate
{
    protected $failException = true;
    protected function exist($value, $rule, $data, $field): bool
    {
        $address = [
           'id' => $data['address_id'],
           'uid' => $data['uid']
        ];
        return !$this->unique($value, $rule, $address, $field);
    }
    protected $rule = [
        'address_id' => 'require|exist:'.UserAddress::class.',id=id&uid=uid',
    ];

// ...

runphp avatar Apr 04 '25 01:04 runphp