CodeIgniter 3关联表查询字段被覆盖问题求助
解决CodeIgniter 3关联查询中字段被覆盖的问题
嘿,这个问题我之前也踩过坑!原因其实很直白:你用了SELECT *同时查询questions和users表,而这两个表大概率有id这类同名字段。当CodeIgniter把查询结果转换成对象或数组时,后出现的表(这里是users)的同名字段会直接覆盖前面表的对应字段,导致你拿不到questions.id这类被覆盖的值。
给你几个实用的解决方案:
1. 明确指定字段并给同名字段加别名(最推荐)
别偷懒用SELECT *,而是明确列出你需要的所有字段,给同名字段起不同的别名,彻底避免冲突。比如:
$this->db->select(" questions.id AS question_id, questions.content, questions.article_id, questions.user_id, users.id AS user_id, users.username, users.email "); // 按需列出需要的字段,给两个表的id分别起别名 $this->db->from("questions"); $this->db->join('users', 'users.id = questions.user_id'); $this->db->where('article_id', $articleId); $this->db->order_by('questions.id', 'DESC'); $query = $this->db->get(); return $query->result();
这样返回的结果对象里,你就能通过$item->question_id拿到问题ID,$item->user_id拿到用户ID,完全不会有覆盖问题。
2. 保留一个表的全字段,给另一个表的同名字段加别名
如果某个表的字段你都需要,不想逐个列出,可以用表名.*保留全字段,只给另一个表的同名字段加别名:
$this->db->select("questions.*, users.id AS user_id, users.username, users.email"); // 保留questions的所有字段,把users的id改成user_id,避免覆盖questions.id $this->db->from("questions"); $this->db->join('users', 'users.id = questions.user_id'); $this->db->where('article_id', $articleId); $this->db->order_by('questions.id', 'DESC'); $query = $this->db->get(); return $query->result();
小提醒
本质上这不是CodeIgniter的问题,是SQL查询的特性:当结果集里出现同名列时,最后一个列的值会覆盖前面的。所以只要用别名区分开同名字段,就能完美解决这个问题。
内容的提问来源于stack exchange,提问作者h0lend3r
相关产品推荐
相关产品推荐

