CakePHP 3.5调用find()方法出现布尔值错误的技术求助
首先,咱们来拆解这个错误的根源:当你调用$this->EstimatedRevenueFromFeesBiz1->find()时,$this->EstimatedRevenueFromFeesBiz1返回的是布尔值false,而不是预期的模型实例,所以才会报错说不能在布尔值上调用find()方法。结合你的代码场景,主要有两个问题需要解决:
1. 模型未正确加载
CakePHP的控制器不会自动加载任意名称的模型,它默认只会加载和控制器名称匹配的模型(比如EstimatedRevenueFromCourseFeesController默认加载EstimatedRevenueFromCourseFees模型)。你用的EstimatedRevenueFromFeesBiz1不属于默认加载范围,所以需要手动加载。
解决方法:
在控制器的initialize()方法中手动加载需要的模型(如果三个业务共用同一个模型表,只需要加载一次主模型即可):
public function initialize() { parent::initialize(); // 如果三个业务是同一张表的数据,只加载主模型 $this->loadModel('EstimatedRevenueFromFees'); // 如果是三个不同的表,分别加载对应的模型 // $this->loadModel('EstimatedRevenueFromFeesBiz1'); // $this->loadModel('EstimatedRevenueFromFeesBiz2'); // $this->loadModel('EstimatedRevenueFromFeesBiz3'); }
另外要注意:如果是单独的模型,必须确保模型文件存在于src/Model/Table/目录下,命名符合CakePHP规范——比如EstimatedRevenueFromFeesBiz1Table.php,类名是EstimatedRevenueFromFeesBiz1Table,且继承自Cake\ORM\Table。
2. 查询条件的语法错误
你原代码里的条件写法有问题:
'conditions' => 'business_id' == 1
这里的==是比较运算符,会先执行'business_id' == 1的判断,结果是false,相当于你把条件设置成了false,这完全不符合查询需求。正确的写法应该是用关联数组来定义条件:
'conditions' => ['business_id' => 1]
修正后的完整示例(共用一个模型的场景)
假设三个业务的数据都存在estimated_revenue_from_fees表中,通过business_id区分,那么控制器代码可以改成这样:
public function initialize() { parent::initialize(); $this->loadModel('EstimatedRevenueFromFees'); } public function index() { // 查询业务1的数据 $estimatedRevenueFromFeesBiz1 = $this->EstimatedRevenueFromFees->find('list', [ 'conditions' => ['business_id' => 1] ]); // 查询业务2的数据 $estimatedRevenueFromFeesBiz2 = $this->EstimatedRevenueFromFees->find('list', [ 'conditions' => ['business_id' => 2] ]); // 查询业务3的数据 $estimatedRevenueFromFeesBiz3 = $this->EstimatedRevenueFromFees->find('list', [ 'conditions' => ['business_id' => 3] ]); // 传递数据到视图 $this->set(compact('estimatedRevenueFromFeesBiz1', 'estimatedRevenueFromFeesBiz2', 'estimatedRevenueFromFeesBiz3')); }
这样修改后,既解决了模型加载的问题,也修正了查询条件的语法错误,应该就能正常获取数据,渲染三栏布局的视图了。
内容的提问来源于stack exchange,提问作者Ken

