You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 16:00:58