代码之家  ›  专栏  ›  技术社区  ›  JayD3e

CakePHP-$hasAndBelongsToMany和$hasmall表之间的关系,这些表位于不同的数据库中,并且具有不同的查询语言?

  •  0
  • JayD3e  · 技术社区  · 14 年前

    关于Stackoverflow,我有一个非常复杂的问题要告诉你,我有三个表需要为应用程序定义它们之间的关联。这些表是:工程师、票证和测试用例。我需要在工程师和票证之间建立$hasMany关系,在测试用例和票证之间建立hasAndBelongToMany关系。这里是关键,工程师和测试用例都在一个mysql数据库上,而票证在一个单独服务器上的sqlite3数据库(trac)上。单独的服务器部分不是问题,因为我们将服务器安装在我的应用程序所在的同一台机器上。我基本上想知道如何设置这些关系,以便在加载每个模型时也加载其依赖项。我会用几乎所有的解决方案来完成工作。顺便说一下,我正在使用CakePHP。

    3 回复  |  直到 14 年前
        1
  •  1
  •   bancer    14 年前

    CakePHP中的多个数据库不支持HABTM关联。为了建立联系,你需要改变核心。至少有一个人做到了这一点。看看 his method

        2
  •  1
  •   deceze    14 年前

    你可以

    $testcases = $this->Testcase->find(…);
    $tickets = $this->Ticket->TestcaseTickets->find('all', array(
        'conditions' => array(
            'TestcaseTickets.testcase_id' => Set::extract('/Testcase/id', $testcases)
        )
    ));
    

    它带走了一点便利,但最终并不会产生很大的影响,特别是如果你在一个特定的时间里自动地这样做的话 afterFind

        3
  •  0
  •   Nik Chankov    14 年前

    我认为在CakePHP中使用2个(或更多)数据库连接不是问题。

    class DATABASE_CONFIG {
    
        var $mysql = array(
            'driver' => 'mysql',
            'persistent' => false,
            'host' => 'localhost',
            'login' => 'user',
            'password' => 'password',
            'database' => 'database',
            'prefix' => '',
            'encoding'=>'utf8'
        );
    
        var $sqlite = array(
            'driver' => 'sqlite',
            'persistent' => false,
            'host' => 'localhost',
            'login' => 'user',
            'password' => 'password',
            'database' => 'database',
            'prefix' => '',
            'encoding'=>'utf8'
        );
    }
    

    顺便说一句,我不太确定sqlite驱动程序,但它应该是这样的。

    最后,您需要为每个模型设置要使用的连接。这可以通过以下方式实现:

    class tickets extends AppModel {
       ...
       var $useDbConfig = 'sqlite';
       ...
    }
    

    尤其是如果您不使用任何特殊的SQL“hacks”,它应该可以工作。