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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 15:57:14