当我使用CI的Active Record执行连接时,有时结果将不会显示所有字段。例如,当使用具有相同字段名称的表执行连接时,表中的一个字段将不会显示在结果中。
示例:
=== TABLE users ===
id INT(10)
first_name VARCHAR(255)
last_name VARCHAR(255)
=== TABLE messages ===
id INT(10)
exp_id INT(10)
dest_id INT(10)
content TEXT
=== CONTENT OF THE DATABASE ===
INSERT INTO users VALUES (1, "Bob", "Smith");
INSERT INTO users VALUES (2, "Graig", "Anderson");
INSERT INTO messages VALUES (999, 1, 2, "Hello Graig!");
=== the query ===
$this->db->where('messages.id', 999);
$this->db->join('users exp', 'users.id=messages.exp_id', 'INNER');
$this->db->join('users dest', 'users.id=messages.dest_id', 'INNER');
$res = $this->db->get('messages');
== the result ===
id exp_id dest_id content first_name last_name
999 1 2 Hello Graig! Bob Smith
我无法检索“dest.first_name”和“dest.first_name”。表“dest”位于join()中但与表“exp”存在冲突,表“exp”还包含“first_name”和“last_name”字段。实际上这不是CI问题,这就是MySQL的行为方式。
可以使用select / aliases进行修复,但有没有办法可以将CI附加(或预先添加)连接表的别名添加到其字段中?结果可能如下所示:
id exp_id dest_id content id_exp first_name_exp last_name_exp id_dest first_name_dest last_name_dest
999 1 2 Hello Graig! 1 Bob Smith 2 Graig Anderson
答案 0 :(得分:3)
“当使用具有相同字段名称的表执行连接时,表格中的一个字段将不会显示在结果中。”
正是你的问题,这是任何db& amp;的标准sql。不是codeigniter。即使您使用“SELECT * ...”,字段名称的最后一个实例也将始终是所选的实例。
简短的回答是,不,CI中没有类似的功能。如您所建议使用别名是解决方案;使它成为yourslef将涉及扩展核心数据库驱动程序类,我猜这是一个比你感兴趣的工作更多
使用ORM可能会解决这个问题,但我认为这本身并不足以说明这一点
答案 1 :(得分:1)
我有同样的错误。我找到了解决这个问题的方法:
=== the query ===
$this->db->select('messages.*');
$this->db->select('exp.id as exp_id, exp.firstname as exp_firstname, exp.lastname as exp_lastname');
$this->db->select('dest.id as dest_id, dest.firstname as dest_firstname, dest.lastname as dest_lastname');
$this->db->where('messages.id', 999);
$this->db->join('users as exp', 'users.id=messages.exp_id', 'INNER');
$this->db->join('users as dest', 'users.id=messages.dest_id', 'INNER');
$res = $this->db->get('messages');
所以结果可能如下:
id exp_id dest_id content exp_id exp_firstname exp_lastname dest_id dest_firstname dest_lastname
999 1 2 Hello Graig! 1 Bob Smith 2 Graig Anderson