我有一个 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、'' 或根本不设置,将停止在任何数据库中创建任何表。
问题:这个“技巧”还需要什么才能奏效?
最简单/最稳定的解决方案将是最好的
最佳答案
对于这种情况我可以提出两点建议:
你能验证你用这个 command 创建的模式吗? ?创建映射后进行验证总是很棒的。
条令模块 orm:validate-schema
在更改数据库后进行逆向工程(例如制作您喜欢的模式)。在更改将生成映射、实体和代理的模式后,使用
orm:convert-mapping
( docs )。您可以阅读更多关于 doctrine 2 的控制台命令的信息 here
希望对您有所帮助!
关于php - Doctrine 2 和 Zend Framework 2.2 的数据库名称注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20844515/