gpt4 book ai didi

php - 使用 CI DataMapper ORM 连接不同数据库中的表

转载 作者:行者123 更新时间:2023-11-29 00:31:51 24 4
gpt4 key购买 nike

我确实搜索了解决方案,但没有找到任何有用的信息。 This问题是关于将多个数据库与数据映射器一起使用,但我已经使用了该方法。

用户模型:

class User extends DataMapper {
var $prefix = "app_";

var $db_params = 'default';
...

公司模式:

class Company extends DataMapper {
var $prefix = "tbl_";

var $db_params = 'super';
...

我有以上型号。它们与用户拥有一个公司和公司拥有多个用户相关。当我创建公司时,会自动创建一个用户,并成功建立关系。

但是,当我尝试删除公司,或尝试访问用户的相关公司时。 DataMapper 在错误的位置查找用户表。

我收到以下错误:

A Database Error Occurred

Error Number: 1146

Table 'a1210alf.app_users' doesn't exist

SELECT `tbl_companies`.* FROM (`tbl_companies`) LEFT OUTER JOIN `app_users` app_users ON `tbl_companies`.`id` = `app_users`.`company_id` WHERE `app_users`.`id` = 4

在我的 CI 配置中,我为两个数据库“默认”和“ super ”设置了两个不同的设置。我在模型中设置了正确的那个。表 app_users 确实存在,所有需要的字段都在那里。不确定我做错了什么。

最佳答案

我已经使用这个解决方案一段时间了。无论如何它仍然没有“崩溃”..所以我想这是正确的方法。

首先,我创建了一个扩展“DataMapper”的“BaseModel”。构造函数如下所示:

/**
* Constructor: calls parent constructor
*/
function __construct($id = NULL, $db = NULL)
{
if ($db != NULL && $this->db_params == '') {
// use these params as default
$this->db_params = array_merge(array(
'dbdriver' => 'mysql',
'pconnect' => true,
'db_debug' => true,
'cache_on' => false,
'char_set' => 'utf8',
'cachedir' => '',
'dbcollat' => 'utf8_general_ci',
'autoinit' => true,
'stricton' => false,
), $db);
}
elseif($this->db_params == '') {
$CI =& get_instance();
$cid = $CI->session->userdata('cid');
if($cid != false || $cid != '') {
$userDB = new Database();
$userDB->get_where(array('company_id'=>$cid));
if($userDB->exists()) {
$this->db_params = array(
'hostname' => $userDB->dbhost,
'database' => $userDB->dbname,
'username' => $userDB->dbuser,
'password' => $userDB->dbpass,
'dbdriver' => 'mysql',
'pconnect' => true,
'db_debug' => true,
'cache_on' => false,
'char_set' => 'utf8',
'cachedir' => '',
'dbcollat' => 'utf8_general_ci',
'autoinit' => true,
'stricton' => false,
);
}
}
}
parent::__construct($id);
}

现在,如果您创建一个用户实例,我们应该执行 $u = new User(NULL, $this->udb); 其中 $this->udb是加载到主 Controller 中的连接参数。

这样模型每次都能得到正确的参数。并且如果需要相关对象,则 BaseModel 知道从哪里获得正确的参数。

我只关心它是否有效 :p

注意:无需在每个模型中设置 var $db_params = 'default';。如果这样做,它将覆盖您在 BaseModel 的构造函数中设置的参数。

也许这对某人有用。但这是一个特例,如果您使用 CodeIgniter + Datamapper,我不鼓励任何人以这种方式设计他们的数据库。

关于php - 使用 CI DataMapper ORM 连接不同数据库中的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16171576/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com