【问题标题】:How to use a second database in Silverstripe如何在 Silverstripe 中使用第二个数据库
【发布时间】:2016-03-31 15:36:16
【问题描述】:

我试图在 _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);
}

【问题讨论】:

    标签: php mysql silverstripe


    【解决方案1】:

    您遇到的问题是另一个数据库不是由 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 语句

    【讨论】:

    • 当我运行 dev/build 时,由于在类之后使用全局而显示错误:解析错误:语法错误,意外 T_GLOBAL
    • 我在页面类的初始化函数中测试了上面的代码,它不应该是“类”内容。我已经更新了上述内容以澄清这一点。
    • 我正在使用 DataObject 来存储表单中的数据,所以首先我需要构建数据库字段(当然我可以手动创建)但我不确定这种关系是否有效了。 init 函数只能在 controller..right 中声明?谢谢
    • init 函数是控制器父对象的一部分,这就是我调用 parent::init() 的原因 - 但您可以在任何类中创建一个名为“init”的函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多