首页 文章

Doctrine 2和Zend Framework 2.2的数据库名称注释

提问于
浏览
2

我有一个标准的作曲家项目Zf2.2与Doctrine 2.实现http://framework.zend.com/manual/2.2/en/user-guide/overview.html中列出的步骤并通过composer安装Doctrine 2 .

{
    "name": "zendframework/skeleton-application",
    "description": "Skeleton Application for ZF2",
    "license": "BSD-3-Clause",
    "keywords": [
    "framework",
    "zf2"
    ],
    "homepage": "http://framework.zend.com/",
    "require": {
        "php": ">=5.3.3",
        "zendframework/zendframework": "2.2.*",
        "zendframework/zend-developer-tools": "0.0.2",
        "doctrine/doctrine-orm-module": "0.7.0"
    }
}

截至目前,该项目只有1个Doctrine连接'orm_default':

return array (
    'doctrine' => array (
        'connection' => array (
            'orm_default' => array (
                'driverClass' => 'Doctrine\DBAL\Driver\PDOMySql\Driver', 
                'params' => array (
                    'host' => 'localhost', 
                    'port' => '3306', 
                    'user' => 'sameuser', 
                    'password' => 'samepassword', 
                    'dbname' => 'dbname1', 
                    'charset' => 'utf8' 
                ) 
            ) 
        ), 
        'driver' => array (
            'modulename_entities' => array (
                'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver', 
                'cache' => 'array', 
                'paths' => array (
                    __DIR__ . '/../src/Modulename/Entity' 
                ) 
            ), 

            'orm_default' => array (
                'drivers' => array (
                    'Modulename\Entity' => 'modulename_entities' 
                ) 
            ) 
        ) 
    ) 
);

我的典型应用程序格式将不同的业务功能分成不同的数据库因此,许多应用程序信息进入“主”数据库,将营销信息转换为“mktg”数据库,后端内容,如错误进入另一个 .

广泛的Google搜索带来了将dbname添加到Entity Annotations的选项,如下所示:

/**
 * @ORM\Entity
 * @ORM\Table
 * (
 *      name="dbname2.error_tickets",
 *      indexes=
 *      {
 *
...
 *      }
 * )
 *
 */
class Error....

但是,当我跑

doctrine-module orm:schema-tool:create

得到:

ATTENTION: This operation should not be executed in a production environment.

Creating database schema...
Database schema created successfully!

在任何数据库中都不会创建表error_tickets . 没有显示错误 . 然而,当我这样注释时:

/**
 * @ORM\Entity
 * @ORM\Table
 * (
 *      name="error_tickets",
 *      indexes=
 *      {
 *
...
 *      }
 * )
 *
 */
class Error....

或者:

/**
 * @ORM\Entity
 * @ORM\Table
 * (
 *      name="dbname1.error_tickets",
 *      indexes=
 *      {
 *
...
 *      }
 * )
 *
 */
class Error....

并运行

doctrine-module orm:schema-tool:create

表error_tickets是在我的默认dbname1中创建的 .

我已经读过,将dbname添加到Table注释是一种“欺骗”学说在另一个数据库上创建所述表的方法,而不会进入冗长,不受支持的设计黑客,而这些黑客并没有真正做好 生产环境 准备 . 我确保了以下几点:

  • 同一用户对两个数据库都有'ALL PRIVILEGES'

  • 两个数据库都在同一台服务器上

  • 没有实施其他设计黑客(我已经尝试过了) . 这是一个干净,有效的zf2 D2安装

  • 将我的doctrine.local.php中的'dbname'键设置为任何null,FALSE,'或者根本不设置它,停止在任何数据库中创建任何表 .

问题:这个“技巧”还需要什么工作?

最简单/最稳定的解决方案将是最好的

1 回答

  • 0

    我可以就这种情况提出两点建议:

    • 您可以验证使用此command创建的架构吗?在创建映射后,它始终很有用 .

    doctrine-module orm:validate-schema

    • 在更改数据库之后执行逆向工程(例如制作首选架构) . 更改架构后使用 orm:convert-mappingdocs)将生成映射,实体和代理 . 您可以阅读有关doctrine 2的控制台命令的更多信息here

    希望能帮助到你!

相关问题