Laravel 9自定义验证规则Query Builder WHERE子句ID为空问题
Laravel自定义验证规则问题解决
1. toSql()显示占位符是正常行为
Laravel查询构建器采用参数绑定机制防范SQL注入,toSql()仅返回SQL模板,不会替换占位符为实际参数。若需查看绑定的真实参数,需搭配getBindings()方法:
Log::debug($model->toSql()); Log::debug($model->getBindings()); // 输出实际参数数组
2. 核心逻辑漏洞:未校验字段对应的模型实例
当前规则仅检查「是否存在符合所有权条件的记录」,而非「用户提交的字段值(如country_id)对应的模型是否满足所有权要求」,完全偏离了验证目标。
修改passes方法,加入字段值对应的模型ID校验:
public function passes($attribute, $value) { $modelQuery = $this->model::query(); // 应用所有权条件 $modelQuery->where($this->ownershipKeys); // 关键:校验当前字段值对应的模型是否属于指定主体 $modelQuery->where('id', $value); Log::debug($modelQuery->toSql()); Log::debug($modelQuery->getBindings()); return $modelQuery->exists(); }
3. 适配不同主键的优化
若你的模型使用非id的主键(如uuid),可动态获取模型主键列名,提升规则通用性:
public function passes($attribute, $value) { $modelInstance = new $this->model; $modelQuery = $modelInstance::query(); $modelQuery->where($this->ownershipKeys); // 动态获取模型主键 $modelQuery->where($modelInstance->getKeyName(), $value); return $modelQuery->exists(); }
内容的提问来源于stack exchange,提问作者Ryan H
相关产品推荐
相关产品推荐

