【问题标题】:symfony 3 doctrine schema_filter not workingsymfony 3 学说 schema_filter 不工作
【发布时间】:2017-10-16 16:44:58
【问题描述】:

我已经在我的数据库和相应的实体上创建了视图。一切似乎都很好,但每当我运行时

php bin/console 学说:schema:validate

它会告诉我mapping没问题,但是db不行,如下:

[Database] FAIL - 数据库架构与当前映射文件不同步。

查了一下,我发现可以配置 DBAL 从验证中过滤掉表。

这是我在 config.yml 上尝试的(检查下面代码的最后一行)。目的是从验证中排除名称以“view”开头的表。

doctrine:
dbal:
    default_connection: default
    connections:
        default:      
            driver: pdo_mysql
            host: '%database_host%'
            port: '%database_port%'
            dbname: '%database_name%'
            user: '%database_user%'
            password: '%database_password%'
            charset: utf8mb4
            default_table_options:
                charset: utf8mb4
                collate: utf8mb4_unicode_ci
            schema_filter: ~^(?!view_)~

因此,documentation 中的 schema_filter 应该将其过滤掉,但事实并非如此。

我检查了其他几个问题,包括this

有什么想法吗? 谢谢

【问题讨论】:

    标签: php symfony doctrine-orm configuration


    【解决方案1】:

    消息告诉您,您的映射与您的数据库架构不同,您必须更新您的数据库架构。 对于 Symfony3 命令是

    php bin/console doctrine:schema:update --force
    

    实际上,这个命令非常强大。它比较你的 数据库应该看起来像(基于你的映射信息 实体)及其实际外观,并执行 SQL 语句 需要将数据库模式更新到它应该在的位置

    你也可以使用

    php bin/console doctrine:schema:update --dump-sql
    

    要查看您需要运行的 SQL,但无需更改数据库方案。

    当你运行时

    php bin/console doctrine:schema:validate
    

    Doctrine 会检查你的映射文件,对你来说没问题。 之后将检查您的架构。在那一刻,您的参数schema_filter 告诉 Doctrine 忽略数据库中名称以 view 开头的所有表,但在您的映射文件中存在表名 view... 的实体为此你会出错

    [Database] FAIL - 数据库架构与当前映射文件不同步。

    所以schema_filter 用于告诉 Doctrine 忽略数据库中的表而不是忽略实体。

    要查看何时使用 schema_filter 假设您需要在数据库中使用名称以 custom_ 开头的自定义表,在您的文件中您没有与此表映射的实体,如果您打电话

     php bin/console doctrine:migrations:diff
    

    这将删除所有自定义表,除非您在配置文件中告诉 Doctrine 忽略自定义表,并且如果设置参数则可以这样做

     schema_filter: ~^(?!custom_)~
    

    请查看Doctrine documentation

    【讨论】:

    • 谢谢@circleandsquare。我知道如何更新架构。问题不在于,而是如何让 symfony 在验证/更新数据库时不考虑视图。在配置中包含 schema_filter 应该可以做到这一点,但事实并非如此。所以 symfony 尝试创建一个与视图同名的表,当然会产生错误。
    • 正如您在上面的配置中看到的那样,我已经包含了 schema_filter 指令并且它不起作用,即它没有过滤掉数据库上的视图。另外,当我写这个问题时,我没有使用学说迁移。我已经安装了它,但后来我遇到了另一个问题。看到这个问题stackoverflow.com/questions/46825774/…
    • 我只想告诉你,模式过滤器工作正常。模式过滤器不会忽略实体,也不能解决您的问题。 Symfony 不提供排除实体的命令,因此您可以定义两个不同的实体管理器,一个用于查看,另一个用于其他实体。
    • 不过,这正是文档所说的 symfony.com/doc/current/bundles/DoctrineMigrationsBundle/…。为视图创建另一个 em 似乎是一个巨大的解决方法。不过我会调查的。
    • @BernardA ilicmsreten 试图传达的是,当您的代码中存在实体类时,将在与架构进行比较时使用它。过滤器影响模式方面,即它允许您使一些表/视图对 diff 工具不可见。但它不会使实体类不可见。所以,如果你的代码中有实体类,它就会参与diffing。
    猜你喜欢
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 2023-02-16
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多