Laravel Collection使用where不等条件返回对象的原因及解决方法
Laravel查询返回格式差异问题解析
问题原因
首先要纠正一个写法错误:Laravel查询构造器不支持==作为比较运算符,你写的where('id','==',$id)属于不规范写法,Laravel会将==当作自定义运算符处理,这会导致查询逻辑和返回结构出现异常。
两种返回格式差异的核心原因:
- 执行
$Details->where('id','!=',$id)时,这是合法的查询逻辑,返回的是Illuminate\Database\Eloquent\Collection对象。当该集合转为JSON时,Laravel会自动以模型的主键作为键名,因此呈现为带键名的对象格式。 - 执行
$Details->where('id','==',$id)时,由于运算符不合法,查询结果的集合结构异常,无法正确识别主键键名,转为JSON时就变成了普通数组格式。
解决方法
修正等于条件的写法
将错误的where('id','==',$id)替换为以下两种合法写法之一:// 省略运算符,默认使用等于判断 $details['series'] = $Details->where('id', $id)->get(); // 明确指定等于运算符 $details['series'] = $Details->where('id', '=', $id)->get();统一返回格式
- 如果希望两种查询都返回普通数组格式:在查询后调用
values()方法重置集合键名,将关联数组转为索引数组:// 不等于查询返回数组 $details['series'] = $Details->where('id','!=',$id)->get()->values(); // 等于查询返回数组 $details['series'] = $Details->where('id', $id)->get()->values(); - 如果希望两种查询都返回带主键键名的对象格式:只需保证查询写法合法即可,合法查询返回的Collection在转JSON时会自动保留主键作为键名。
- 如果希望两种查询都返回普通数组格式:在查询后调用
内容的提问来源于stack exchange,提问作者muhammed rashid
相关产品推荐
相关产品推荐

