Php codeigniter活动记录:执行联接时字段丢失

Php codeigniter活动记录:执行联接时字段丢失,php,mysql,codeigniter,join,Php,Mysql,Codeigniter,Join,当我与CI的活动记录执行联接时,有时结果不会显示所有字段。例如,当使用具有相同字段名的表执行联接时,该表的一个字段将不会显示在结果中 例如: === 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 DA

当我与CI的活动记录执行联接时,有时结果不会显示所有字段。例如,当使用具有相同字段名的表执行联接时,该表的一个字段将不会显示在结果中

例如:

=== 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”位于join()中,但与表“exp”存在冲突,该表还包含字段“first\u name”和“last\u name”。实际上这不是CI问题,这是MySQL的行为

可以使用select/ALIAES对其进行修复,但是否有办法选择将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
当使用具有相同字段名的表执行联接时,该表的一个字段将不会显示在结果中

这正是您的问题,这是任何db的标准sql&而不是codeigniter。字段名的最后一个实例将始终是选定的实例,即使您使用“SELECT*…”

简而言之,没有,CI中没有类似的功能。按照您的建议使用别名是解决方案;要使其成为您的首选,需要扩展核心db驱动程序类,我猜这远远超出您的兴趣

使用ORM可能会解决这个问题,但我认为这本身并不足以解决这个问题。

“当使用具有相同字段名的表执行联接时,表的一个字段将不会显示在结果中。”

这正是您的问题,这是任何db的标准sql&而不是codeigniter。字段名的最后一个实例将始终是选定的实例,即使您使用“SELECT*…”

简而言之,没有,CI中没有类似的功能。按照您的建议使用别名是解决方案;要使其成为您的首选,需要扩展核心db驱动程序类,我猜这远远超出您的兴趣


使用ORM可能会解决这个问题,但我认为这本身不足以成为这样做的理由

我有你同样的错误。我找到了这个问题的解决方案:

        === 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

我也有你的错误。我找到了解决这个问题的办法:

        === 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