如何在 Silverstripe 中使用第二个数据库

How to use a second database in Silverstripe

我试图在 _config.php

中声明一个新的数据库
global $databaseConfig2;
$databaseConfig2 = array(
    "type" => 'MySQLDatabase',
    "server" => 'localhost',
    "username" => 'local_dbuser',
    "password" => 'aPassword',
    "database" => 'local_db2',
    "path" => '',
);

然后切换到我需要使用的控制器中的第二个数据库:

public function doStuff() {
    global $databaseConfig, $databaseConfig2;

    // connect to DB 2
    DB::connect($databaseConfig2);

    // create a query.. this will go to "databaseB"
    $query = new SQLQuery("*", "MyTable");

    $result = $query->execute();

    // do something with the result...

    // when done, switch back to the regular DB Config
    DB::connect($databaseConfig);
}

我从 http://www.silverstripe.org/community/forums/customising-the-cms/show/13692 拿来的。但它不起作用。

另外,我尝试了这段代码,将表单中的任何值插入到这个单独的数据库中。

SecureFormInput.php

class SecureFormInput extends DataObject{

    global $databaseConfig, $databaseConfig2;

    DB::connect($databaseConfig2);

    private static $db = array(
        'FirstName' => 'Varchar',
        'SureName'  => 'Varchar',
        'OtherName' => 'Varchar',
        'DateOfBirth' => 'Date',
        'Gender'    => 'Boolean'
    );

    private static $has_one = array(
        'SecureForm' => 'SecureForm'
    );

    DB::connect($databaseConfig);
}

您遇到的问题是另一个数据库未由 SilverStripe 管理,因此您无法使用 "ORM" 方法。您可以通过 DB::Query('SELECT * FROM Table') 使用常规 SQL 语句,例如可以放置/替换 Page.php 初始化函数...

function init() {

    parent::init();

    //...

    global $databaseConfig, $databaseConfig2;
    DB::connect($databaseConfig2);// connect to DB 2

    $query = DB::Query("SELECT MyData FROM MyTestTable");
    foreach ($query as $row) var_dump($row);

    DB::connect($databaseConfig);// when done, switch back to the regular DB 

    //...
}

如果要写入数据,则需要在 DB::Query

中再次使用完整的 INSERT 或 UPDATE 语句