alb*_*ert 7 php symfony doctrine-orm
我如何阻止symfony尝试为我在学说迁移中创建的视图创建表?
/**
* Class TenancyPendingInspection
* @ORM\Entity(repositoryClass="DJABundle\PropertyVisit\Repository\TenancyPendingInspectionRepository", readOnly=true)
* @ORM\Table(name="view_tenancies_pending_inspections")
*/
class TenancyPendingInspection
{
Run Code Online (Sandbox Code Playgroud)
我也有教条迁移文件.
doctrine:
dbal:
default_connection: default
connections:
default:
[...]
charset: UTF8
server_version: 5.6
schema_filter: ~^(?!view_)~
Run Code Online (Sandbox Code Playgroud)
php app/console doc:sch:val
[Mapping] OK - The mapping files are correct.
[Database] FAIL - The database schema is not in sync with the current mapping file.
Run Code Online (Sandbox Code Playgroud)
php app/console doc:sch:update --dump-sql
CREATE TABLE view_tenancies_pending_inspections ...
Run Code Online (Sandbox Code Playgroud)
简短的回答:这是不可能的。
发生这种情况是因为MysqlPlatform忽略了视图。
//vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/MySqlPlatform.php
class MySqlPlatform extends AbstractPlatform
[...]
public function getListTablesSQL()
{
return "SHOW FULL TABLES WHERE Table_type = 'BASE TABLE'";
}
[...]
Run Code Online (Sandbox Code Playgroud)
解决方案:创建一个不忽略视图的新MysqlPlatform:
class MysqlViewsPlatform extends \Doctrine\DBAL\Platforms\MySqlPlatform
{
public function getListTablesSQL()
{
return "SHOW FULL TABLES";
}
}
Run Code Online (Sandbox Code Playgroud)
使用您的平台创建服务:
services:
doctrine.dbal.mysql_views_platform:
class: albertsola\DoctrineViews\MysqlViewsPlatform
arguments: []
Run Code Online (Sandbox Code Playgroud)
通过您的连接使用该平台:
doctrine:
dbal:
default_connection: default
connections:
default:
driver: "%database_driver%"
host: "database_host%"
port: "database_port%"
dbname: "database_name%"
user: "database_user%"
password: "database_password%"
charset: UTF8
platform_service: "doctrine.dbal.mysql_views_platform"
Run Code Online (Sandbox Code Playgroud)
app/console 学说:schema:validate 此命令验证实体和视图实体是否同步。
副作用: app/console 学说:schema:update --dump-sql 如果视图和实体不同步,这将生成不应执行的 SQL!您必须手动更新数据库中的视图。
我使用学说迁移来解决这个问题。尽管doctrine:schema:update --dump-sql对于检查它在您的视图/实体中不匹配的内容非常有用。
注意:此黑客停止创建表,但学说架构差异仍然尝试更新添加外键的“表”。
小智 0
您应该能够使用 setFilterSchemaAssetsExpression。
http://www.doctrine-project.org/api/dbal/2.4/source-class-Doctrine.DBAL.Configuration.html#87-99
如果做不到这一点,如果您想做更少的编程和更多的配置,您可以将视图放入另一个实体管理器中。但这不是最好的方式......
https://symfony.com/doc/3.3/doctrine/multiple_entity_managers.html
| 归档时间: |
|
| 查看次数: |
1553 次 |
| 最近记录: |