【发布时间】: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/122 和 github.com/doctrine/DoctrineORMModule/blob/master/docs/…。经过一些调整后,它可以工作,但仅限于一个模块到一个数据库。我确信有办法解决这个问题 - 我在试验期间遇到的错误似乎很有希望
标签: php database doctrine-orm zend-framework2