CodeIgniter4调用findAll()报读取数组name属性错误
CodeIgniter 4 CRUD列表页读取属性报错排查
问题描述
初次学习CodeIgniter 4框架,跟随教程实现基础CRUD功能时,运行项目列表页抛出Attempt to read property 'name' on array错误。与朋友使用完全相同的教程代码,朋友环境可正常运行,确认数据库表中name、description、id字段均真实存在。
相关代码
控制器代码
<?php namespace App\Controllers; use CodeIgniter\RESTful\ResourcePresenter; class Project extends ResourcePresenter { protected $modelName = 'App\Models\ProjectModel'; public function index() { return view('projects/index', ['projects' => $this->model->orderBy('created_at', 'asc')->findAll()]); } }
列表视图代码
<?php foreach ($projects as $project) : ?> <tr> <td><?= $project->name ?></td> <td><?= $project->description ?></td> <td> <form action="<?php echo base_url('/projects/delete/' . $project->id); ?>" method="post"> <a class="btn btn-outline-info" href="<?php echo base_url('/projects/show/' . $project->id); ?>"> Show </a> <a class="btn btn-outline-success" href="<?php echo base_url('/projects/edit/' . $project->id); ?>"> Edit </a> <button type="submit" class="btn btn-outline-danger">Delete</button> </form> </td> </tr> <?php endforeach; ?>
问题根源
报错的直接原因是:模型findAll()方法返回的查询结果为关联数组格式,但视图中使用对象属性语法->读取字段值,PHP无法在数组类型数据上读取对象属性,因此抛出错误。
相同代码运行结果不一致是环境配置差异导致:CodeIgniter 4的模型支持配置查询结果的返回格式,你朋友的环境将模型返回值配置为对象格式,因此用->读取属性可正常运行;你的环境默认返回数组格式,与视图的读取语法不匹配。
解决方案
二选一即可,推荐优先选第二种对齐教程配置:
- 方案1:修改模型配置,统一返回对象格式
打开App/Models/ProjectModel.php文件,在模型类内部添加如下配置,指定查询结果返回为对象,无需修改现有视图代码即可正常运行:protected $returnType = 'object'; - 方案2:修改视图读取语法,适配数组返回格式
把视图中所有通过$project->字段名读取值的写法,替换为关联数组下标读取写法:<?php foreach ($projects as $project) : ?> <tr> <td><?= $project['name'] ?></td> <td><?= $project['description'] ?></td> <td> <form action="<?php echo base_url('/projects/delete/' . $project['id']); ?>" method="post"> <a class="btn btn-outline-info" href="<?php echo base_url('/projects/show/' . $project['id']); ?>"> Show </a> <a class="btn btn-outline-success" href="<?php echo base_url('/projects/edit/' . $project['id']); ?>"> Edit </a> <button type="submit" class="btn btn-outline-danger">Delete</button> </form> </td> </tr> <?php endforeach; ?>
内容的提问来源于stack exchange,提问作者NUUR FATIN SHAHIRAH
相关产品推荐
相关产品推荐

