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初始化:
- 新建自定义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); } }
- 在你的基础模型类中指定使用自定义Builder
public function newEloquentBuilder($query) { return new \App\Database\Builder($query); }
注意:不推荐通过调整PHP错误报告等级屏蔽该警告,隐藏问题可能带来后续潜在的逻辑异常。
内容的提问来源于stack exchange,提问作者Anibal Cardozo
相关产品推荐
相关产品推荐

