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

标签 php database doctrine-orm zend-framework2

我有一个 Zf2.2 的标准 Composer 项目和 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 添加到实体注释的选项,如下所示:

/**
 * @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 添加到表注释是一种“欺骗”学说在另一个数据库上创建所述表的方法,而无需进行冗长、不受支持的设计黑客攻击,这些设计黑客并没有真正做好生产准备。我已确保以下内容:

  • 同一用户对两个数据库具有“所有权限”
  • 两个数据库在同一台服务器上
  • 没有实现其他设计技巧(我试过了)。这是一个干净、有效的 zf2 + D2 安装
  • 将我的 doctrine.local.php 中的 'dbname' 键设置为 null、FALSE、'' 或根本不设置,将停止在任何数据库中创建任何表。

问题:这个“技巧”还需要什么才能奏效?

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

最佳答案

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

  1. 你能验证你用这个 command 创建的模式吗? ?创建映射后进行验证总是很棒的。

    条令模块 orm:validate-schema

  2. 在更改数据库后进行逆向工程(例如制作您喜欢的模式)。在更改将生成映射、实体和代理的模式后,使用 orm:convert-mapping ( docs )。您可以阅读更多关于 doctrine 2 的控制台命令的信息 here

希望对您有所帮助!

关于php - Doctrine 2 和 Zend Framework 2.2 的数据库名称注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20844515/

相关文章:

php - 使用 PHP xmlwriter 在 xml 文件中添加多个数据

sql-server - SQL Server 索引顺序(日期时间字段)

database - IPN Paypal - 它是独一无二的吗?

zend-framework - 教义 2 "Class does not exist"持续存在

mysql - Left Join with Where 子句返回空结果

php - Doctrine 2,HINT_FORCE_PARTIAL_LOAD 不会获取连接的实体

php - 有没有办法在 Controller 内的单个方法上使用 Laravel api throttle ?

javascript - 为后端和前端 View (PHP、Backbone)定义一次 HTML

javascript - 如何从php中的知识图谱api中仅提取文章正文?

c++ - 用 C++ 编写 Excel 电子表格