【问题标题】:Database Name Annotation for Doctrine 2 and Zend Framework 2.2Doctrine 2 和 Zend Framework 2.2 的数据库名称注释
【发布时间】:2014-01-17 15:10:34
【问题描述】:

我有一个带有 Doctrine 2 的 Zf2.2 标准作曲家项目。实现 http://framework.zend.com/manual/2.2/en/user-guide/overview.html 中列出的步骤并通过作曲家安装 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

在我的默认 dbname1 中创建表 error_tickets。

我已经读过,将 dbname 添加到 Table 注释是一种“欺骗”学说在另一个数据库上创建所述表的方法,而无需进行冗长的、不受支持的设计技巧,这些技巧还没有真正准备好生产。我已确保以下几点:

  • 同一个用户对两个数据库都拥有“ALL PRIVILEGES”
  • 两个数据库在同一台服务器上
  • 没有实施其他设计技巧(我已经尝试过)。这是一个干净、有效的 zf2 + D2 安装
  • 将我的 dictionary.local.php 中的 'dbname' 键设置为 null、FALSE、'' 中的任何一个或根本不设置它,会阻止在任何数据库中创建任何表。

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

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

【问题讨论】:

  • 如果你使用不同的数据库,你必须使用不同的连接设置。正如您所注意到的,DBName 是在 Connection 中设置的。当一组实体属于一个数据库而另一组实体属于另一个数据库时,请相应地设置您的驱动程序,以使某些实体使用一个驱动程序,而其他实体使用另一个;)(通常基于命名空间)
  • 谢谢山姆。我无法在 zf2.2 中找到受教义支持的示例。我发现了很多非常令人印象深刻的黑客,但这些都带有“不要在生产中使用”的免责声明。任何建议的示例代码?
  • 好的。我几乎放弃了尝试这个“技巧”。我确实找到了这两个链接:github.com/doctrine/DoctrineORMModule/issues/122github.com/doctrine/DoctrineORMModule/blob/master/docs/…。经过一些调整后,它可以工作,但仅限于一个模块到一个数据库。我确信有办法解决这个问题 - 我在试验期间遇到的错误似乎很有希望

标签: php database doctrine-orm zend-framework2


【解决方案1】:

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

  1. 您能否验证您使用此 command 创建的架构?创建映射后进行验证总是很棒。

    doctrine-module orm:validate-schema

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

希望对你有帮助!

【讨论】:

  • 我正在从头开始这个项目,所以计划是从我们制定的基础知识和原型开始。
  • 是的,cli 中的那些学说 2 的命令将对模式或实体生成有很大帮助。您对使用 orm:convert-mapping 进行逆向工程有任何疑问吗?
  • 此外,验证架构有效,但仅适用于默认数据库。我会记住映射转换。最终的好功能
  • 是的,这很有帮助。随着您更多地投入生产,您将需要一些列,然后您会通过模式生成实体和映射。
猜你喜欢
  • 2014-07-25
  • 1970-01-01
  • 1970-01-01
  • 2012-06-07
  • 1970-01-01
  • 1970-01-01
  • 2011-12-13
  • 1970-01-01
  • 2012-06-13
相关资源
最近更新 更多