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

PHP7.2环境下Eloquent调用自定义Scope触发count参数警告如何解决

问题修复方案

方案1:自定义Scope内部兼容(推荐,侵入性最低)

直接在你的whereInOrAny Scope方法开头添加wheres属性初始化逻辑,无需修改框架源码或全局配置:

public function scopeWhereInOrAny($query, $column, $values)
{
    // 新增这行:提前初始化wheres为空数组,避免count(null)警告
    if (is_null($query->wheres)) {
        $query->wheres = [];
    }
    // 下面是你原本的Scope逻辑
    // ...
}

如果有多个同类自定义Scope,可以把这段初始化逻辑抽成公共方法复用。

方案2:升级Illuminate组件版本

你遇到的是旧版Illuminate Database组件的已知兼容问题,适配PHP7.2+的5.5 LTS及以上版本已经修复了该问题:Eloquent Builder的wheres属性默认初始化为空数组,不会再出现null的情况。升级后无需修改自定义Scope代码即可解决警告。

方案3:全局重写Builder的callScope方法(适合多Scope批量兼容)

如果项目中有大量同类自定义Scope,不想逐个修改,可自定义Eloquent Builder类重写callScope方法,统一处理wheres初始化:

  1. 新建自定义Builder类
<?php
namespace App\Database;
use Illuminate\Database\Eloquent\Builder as BaseBuilder;
class Builder extends BaseBuilder
{
    public function callScope($scope, $parameters)
    {
        // 全局统一处理wheres初始化
        if (is_null($this->wheres)) {
            $this->wheres = [];
        }
        return parent::callScope($scope, $parameters);
    }
}
  1. 在你的基础模型类中指定使用自定义Builder
public function newEloquentBuilder($query)
{
    return new \App\Database\Builder($query);
}

注意:不推荐通过调整PHP错误报告等级屏蔽该警告,隐藏问题可能带来后续潜在的逻辑异常。

内容的提问来源于stack exchange,提问作者Anibal Cardozo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 19:57:03