【问题标题】:Joining tables in different databases with the CI DataMapper ORM使用 CI DataMapper ORM 连接不同数据库中的表
【发布时间】:2013-04-23 14:10:17
【问题描述】:

我确实搜索了解决方案,但没有发现任何有用的信息。 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 配置中,我对两个数据库“默认”和“超级”有两种不同的设置。我在模型中设置了正确的一个。表 app_users 确实存在,所需的所有字段都在那里。不知道我做错了什么。

【问题讨论】:

    标签: php mysql join codeigniter-2 codeigniter-datamapper


    【解决方案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,我不鼓励任何人这样设计他们的数据库。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 有可能,我将使用我现在使用的代码编辑问题。
      • 没问题。请注意,该应用程序为使用该应用程序的每个“公司”使用了不同的数据库。这就是为什么当有人登录(在默认(共享)系统数据库上运行)时,我可以在控制器中加载正确的数据库连接参数。如果没有“动态”参数,则可以通过在主控制器中返回静态参数来使用相同的方法。
      猜你喜欢
      • 2015-01-06
      • 1970-01-01
      • 2013-02-14
      • 1970-01-01
      • 2010-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-02
      相关资源
      最近更新 更多