【问题标题】:JOIN tables from one DB to another DB in Codeigniter在 Codeigniter 中将表从一个数据库连接到另一个数据库
【发布时间】:2020-01-13 06:46:37
【问题描述】:

数据库.php

$db['default'] = array(
    'dsn' => '',
    'hostname' => 'localhost',
    'username' => 'root',
    'password' => '',
    'database' => 'main_db',
    'dbdriver' => 'mysqli',
    'dbprefix' => 'sim_',
    'pconnect' => FALSE,
    'db_debug' => FALSE,
    'cache_on' => FALSE,
    'cachedir' => '',
    'char_set' => 'utf8',
    'dbcollat' => 'utf8_general_ci',
    'swap_pre' => '',
    'encrypt' => FALSE,
    'compress' => FALSE,
    'stricton' => FALSE,
    'failover' => array(),
    'save_queries' => FALSE,
);

$db['master'] = array(
    'dsn' => '',
    'hostname' => 'localhost',
    'username' => 'root',
    'password' => '',
    'database' => 'secondary_db',
    'dbdriver' => 'mysqli',
    'dbprefix' => 'gap_',
    'pconnect' => FALSE,
    'db_debug' => FALSE,
    'cache_on' => FALSE,
    'cachedir' => '',
    'char_set' => 'utf8',
    'dbcollat' => 'utf8_general_ci',
    'swap_pre' => '',
    'encrypt' => FALSE,
    'compress' => FALSE,
    'stricton' => FALSE,
    'failover' => array(),
    'save_queries' => FALSE,
);

我在 Codeigniter 3 中使用了两个数据库,并且工作正常。现在我面临着在上述数据库中加入表的问题。有没有可能?如果是,那该怎么做?

示例代码:

public function __construct()
{
    parent::__construct();

    $this->db_ecom = $this->load->database('master', TRUE);
}

public function getOrderDetails() {
   ...       
   $this->db->join('countries', 'countries.country_id=orders.order_country', 'left');
   $q = $this->db_ecom->get('orders');
   ...
}

在上面的代码示例中,$this->db 代表main_db,因此$this->db_ecom 代表secondary_db

main_db - 包含国家表 (country_id, country_name)。
secondary_db - 包含订单表(带有 Country_id 列)。

所以现在我想加入这些表以将国家/地区显示为名称而不是 ID。

【问题讨论】:

  • 当数据库在同一台服务器上时,MySQL 可以进行内部数据库连接 SELECT * FROM database1.table1 INNER JOIN database2.table1 ... 您不必像现在这样进行单独的连接..
  • @Martin 我不是 StackOverflow 的新手,我已经检查了你的答案,但它根本没有回答我的问题。如果它看起来真的是重复的,则表明您没有详细说明问题。我们可以将它用作原始查询,但我想知道它是否可能?
  • @silambarasanR.D 我刚刚重读了你的问题,nowhere 你有没有提到你不想使用标准查询来做到这一点
  • 我的意思是 -> “发帖前先校对!现在你已经准备好提出你的问题了,深吸一口气,从头到尾通读一遍。假装你是第一次看到它:这有意义吗?尝试自己在一个新的环境中重现问题,并确保您可以仅使用问题中包含的信息来这样做。添加您错过的任何细节并再次阅读它。现在现在是确保您的标题仍然描述问题的好时机!”

标签: php mysql database codeigniter join


【解决方案1】:

作为来自 'Anu' 的回答 正如 Martin 提到的这个问题可能重复。

$this->db->join('Kalix2.ph_Companies', 'Kalix2.ph_Companies.CompanyName = Asterisk.cdr.CompanyName');

如果我们使用带有 PREFIX

的表,它将不会被执行

数据库结构:

  • main_db - 表 "prefix_countries"
  • secondary_db - 表 "prefix_orders"

假设我使用的是dbprefix

$this->db->join('main_db.pre_Companies', 'main_db.pre_Companies.CompanyName = secondary_db.pre_cdr.CompanyName', 'left', FALSE); //You can use NULL replacing 'left'. FALSE in last parameter used to execute the query without enclosing Table Prefix.

解决方案:

public function getOrderDetails() {
   $this->db_ecom->select("countries.country_id, countries.country_name,.."); //Getting values

// Here `$this->db` is 'main_db' and `$this->db_ecom` is 'secondary'.
   $this->db_ecom->join("{$this->db->database}.{$this->db->dbprefix}countries as countries", "countries.country_id={$this->db_ecom->dbprefix}orders.order_country", 'left', FALSE);

   $q = $this->db_ecom->get('orders'); // No need to use $this->db_ecom->from("order"); seperately as @Raymond Nijland said.
   ...
}

FALSE 在最后一个参数中用于执行查询而不包含表前缀。所以我们必须手动输入表格前缀,或者我们可以使用$this->db->dbprefix() / $this->db_ecom->dbprefix() 方法返回表格前缀

我不是在这里硬编码数据库名称。当你上线时它会很有用。所以我使用$this->db->database / $this->db_ecom->database 方法返回数据库名称

注意:如果您要上线,您应该创建一个授予两个数据库访问权限的用户,否则它会抛出 Mysql 错误。

感谢那些辛勤工作的评论者。
对于那些人Stackoverflow 不是为了赢得声誉、徽章或特权,它只是为了知道预期问题的答案。

如果你真的面临这种情况,它会很有用。编码愉快。

【讨论】:

    【解决方案2】:

    你试过这个语法吗:

    $this->db->join('main_db.countries', 'main_db.countries.country_id=secondary_db.orders.order_country', 'left');
    

    【讨论】:

    • 是的,我有,但它不会工作。 :( (500 内部服务器错误)
    猜你喜欢
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多