2

我使用 Cake 控制台生成了一个模式文件,该模式文件使用 after() 方法在数据库中创建一些默认记录。

'schema create' 命令适用于默认数据库,但是当我尝试为我的测试数据库执行相同的命令并使用 --connection 参数时......发生了一些奇怪的事情。它确实在测试数据库下创建了表,但它试图在默认数据库中插入记录。

我认为这可能与 after() 方法有关。

// Works. Creates the tables and inserts records successfully to the default

Console/cake schema create -s 1

// Breaks. Creates the tables under test but attempts to insert record in the default database

Console/cake schema create -s 1 --connection test

这是我的架构文件:

<?php 

// Use this Schema for all Stage_2.0 Releases
App::uses("ClassRegistry", "Utility");
App::uses("Shoe", 'Model');

class AppSchema extends CakeSchema {

    public function before($event = array()) {
            // the line below always outputs 'default'... even though --connection parameter is set to 'test'
        debug($this->connection);
        $db = ConnectionManager::getDataSource($this->connection);
        $db->cacheSources = false;
        return true;
    }

    public function after($event = array()) {
        if(isset($event['create'])){
            switch($event['create']){
                case "shoes":
                    $this->InsertSampleShoes();
                    break;
            }
        }
    }

    public function InsertSampleShoes(){
        $shoe = ClassRegistry::init("Shoe");
        $records = array(
            array(
                "Shoe" => array(
                    "name" => "Shoe 1"
                )
            ),
            array(
                "Shoe" => array(
                    "name" => "Shoe 2"
                )
            )
        );
        $shoe->saveAll($records);
    }

        // ... table name, column definitions etc ...

}
4

1 回答 1

3

好的,在Mark Story在其他地方的回复之后,这个问题的答案是您需要在加载模型后为其设置数据库配置,否则它也会使用默认值。

模式类直接与数据库集成,而模型通过正常的 cakephp 配置设置运行。

因此,对于上面的示例,请执行以下操作:

public function InsertSampleShoes(){
    $shoe = ClassRegistry::init("Shoe");
    $shoe->useDbConfig = $this->connection;
    $records = array(
        array(
            "Shoe" => array(
                "name" => "Shoe 1"
            )
        ),
        array(
            "Shoe" => array(
                "name" => "Shoe 2"
            )
        )
    );
    $shoe->saveAll($records);
}
于 2014-02-03T08:14:41.930 回答