CodeIgniter 4 Model中find()结合where查询返回结果格式问题求助
嘿,我来帮你捋捋这个问题~
首先,咱们先搞清楚为什么会出现这种情况:
为什么 find('username', 'myname') 返回 null?
find() 方法的默认逻辑是根据主键字段查询单条记录,比如你用 find(1) 时,它会去找主键(通常是id)等于1的记录。而你写 find('username', 'myname'),ORM会把第一个参数当成主键值来匹配,相当于找主键等于username的记录,自然找不到,所以返回null啦。
如何正确通过username查询并得到一维数组?
根据你用的ORM(看起来像是ThinkPHP或者类似的框架),正确的写法应该是用链式调用的where搭配find(),但你说这样得到了二维数组,可能是这几个原因:
- 你不小心把
find()写成了select()(select()本来就返回多条记录的二维数组) - 你的ORM版本或Model配置导致
find()返回了包裹后的数组 - 返回的是模型对象,你直接转成数组时出现了嵌套
给你几个靠谱的解决方法:
方法1:标准链式调用(确保用find()而非select())
// 正确的写法,应该返回单条记录的一维数组/模型对象 $data = $userModel->where('username', 'myname')->find(); // 如果返回的是模型对象,转成一维数组的话: $data = $userModel->where('username', 'myname')->find()->toArray();
方法2:强制取第一条记录(如果确实返回了二维数组)
如果不管怎么调用find()都返回二维,那可以直接取数组的第一个元素:
$data = $userModel->where('username', 'myname')->find()[0];
不过这个是临时解决办法,最好还是排查下为什么find()会返回二维,比如检查Model里有没有重写find方法,或者框架版本的差异。
方法3:用数组形式传where条件
有些ORM更推荐这种写法,也能避免链式调用的小坑:
$data = $userModel->where(['username' => 'myname'])->find();
总结一下
核心问题就是find()的参数用法不对,以及可能的ORM返回格式差异。先确认自己用的是find()而不是select(),再试试上面的写法,应该就能得到你想要的一维数组啦~
内容的提问来源于stack exchange,提问作者Bharga Wiguna
相关产品推荐
相关产品推荐

