1

我确实搜索了解决方案,但没有发现任何帮助。这个问题是关于使用带有数据映射器的多个数据库,但我已经使用了这种方法。

用户模型:

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 配置中,我对两个数据库“默认”和“超级”有两种不同的设置。我在模型中设置了正确的一个。表 app_users 确实存在,所需的所有字段都在那里。不知道我做错了什么。

4

2 回答 2

1

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

首先,我创建了一个扩展“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加载主控制器中的连接参数。

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

我只关心它是否有效:p

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

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

于 2013-12-04T12:12:03.823 回答
0

我认为您无法解决不同数据库之间的关系。你必须用你自己的逻辑来模拟这个。

于 2013-12-04T11:14:13.390 回答