我确实在搜索解决方案,但没有找到任何帮助。 This问题是关于使用datamapper的多个数据库,但我已经使用了该方法。
用户模型:
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配置中,我对两个数据库'default'和'super'有两个不同的设置。我在模型中设置了正确的一个。表app_users确实存在,所有需要的字段都在那里。不确定我做错了什么。
答案 0 :(得分:1)
我现在正在使用这个解决方案。在任何情况下它仍然没有'破坏'所以我想这是正确的方法。
首先,我创建了一个'BaseModel',它扩展了'DataMapper'。构造函数如下所示:
/**
* 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
是在主控制器中加载的连接参数。
这样,模型每次都会获得正确的参数。如果需要相关对象,BaseModel知道在哪里获得正确的参数。
我所关心的只是它有效:p
注意:无需在每个模型中设置var $db_params = 'default';
。如果这样做,它将覆盖您在BaseModel的构造函数中设置的参数。
也许这对某人有用。但这是一个特例,如果你使用CodeIgniter + Datamapper,我不鼓励任何人以这种方式设计数据库。
答案 1 :(得分:0)
我认为你无法解决不同数据库之间的关系。你必须用你自己的逻辑来模仿它。