【问题标题】:codeigniter Active Record : Fields lost when performing a JOINcodeigniter Active Record:执行 JOIN 时丢失的字段
【发布时间】:2013-10-23 21:30:47
【问题描述】:

当我使用 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

【问题讨论】:

    标签: php mysql codeigniter join


    【解决方案1】:

    “当对具有相同字段名称的表执行连接时,该表的字段之一不会显示在结果中。”

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

    简短的回答是,不,CI 中没有类似的功能。按照您的建议使用别名是解决方案;自己动手将涉及扩展核心数据库驱动程序类,我猜这比你感兴趣的工作要多得多

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-24
        • 1970-01-01
        • 2013-06-14
        • 2012-02-19
        • 2012-06-16
        • 1970-01-01
        • 2012-06-05
        • 2012-11-29
        相关资源
        最近更新 更多