如何对比数据库字段与对象数组值,解决where_in数组转字符串报错
问题原因
CodeIgniter的where_in()方法要求传入的匹配值为一维值数组,你当前传入的$varIds是对象数组,每个元素是包含var_id属性的对象,框架拼接SQL时尝试将对象转为字符串,就触发了「array to string conversion」错误。
解决方案
方案一:临时转换对象数组为一维值数组
在执行where_in前先提取所有var_id属性的值,构造符合要求的一维数组:
// 提取所有var_id属性,得到['141','143','146','149']格式的一维数组 $filterVarIds = array_column($varIds, 'var_id'); $this->db->where_in('items_options_value.var_id', $filterVarIds);
如果你的PHP版本低于7.0,不支持array_column处理对象数组,可以改用array_map实现转换:
$filterVarIds = array_map(function($item) { return $item->var_id; }, $varIds); $this->db->where_in('items_options_value.var_id', $filterVarIds);
方案二:优化原查询方法返回格式(可选)
如果get_var_id()方法的业务场景只需要用到var_id的值,你可以直接修改该模型方法,查询时直接返回一维值数组,省去后续转换步骤:
以CodeIgniter3为例,原查询如果返回的是对象数组:
// 原写法 return $this->db->select('var_id')->get()->result();
修改为直接返回一维数组:
// 修改后写法 $res = $this->db->select('var_id')->get()->result_array(); return array_column($res, 'var_id');
后续直接用返回的数组传入where_in即可正常执行。
内容的提问来源于stack exchange,提问作者Aasem Shoshari
相关产品推荐
相关产品推荐

