【问题标题】:Symfony 5 - Doctrine with schema_filter not workingSymfony 5 - 带有 schema_filter 的 Doctrine 不起作用
【发布时间】:2023-02-16 18:05:46
【问题描述】:

当我在我的项目中执行命令行 doctrine:schema:update --force 时,我试图忽略两个实体,他们是这样写的:

/**
 * @ORM\Entity(readOnly=true)
 * @ORM\Table(name="view_tableau_de_bord")
 */
class ViewTableauDeBord
{
    //...
}

在我的 doctrine.yaml 配置文件中:

doctrine:
dbal:
    default_connection: default

    connections:
        default:
            url: '%env(resolve:DATABASE_URL)%'
            driver: 'pdo_pgsql'
            server_version: '12'
            charset: utf8
            schema_filter: ~^(?!view_)~
        # ...

当我的观点在 schema_filter 中时,Doctrine 不断生成所有实体。你对此有解释吗?这是我第一次在项目中使用此选项。

项目配置:

  • Symfony 5.4.14
  • PHP 7.4.26
  • 学说:orm:2.13.3
  • 学说/注释:1.13.3
  • 学说/学说捆绑:2.7.0
  • 条令/条令迁移包:3.2.2
  • symfony/学说桥:5.4.14
  • 条令/数据装置:1.5.3

【问题讨论】:

    标签: php symfony doctrine symfony4 symfony5


    【解决方案1】:

    完整解释:

    schema_filter 不是用来“过滤”实体的,而是用来从学说意识中过滤数据库表的。

    这是一个例子:
    假设您手动创建一个表,该表从名为 view_booking_by_customer_per_year 的自定义原始 php cronjob 更新,您的项目中的代码不使用该表,但用于数据分析。

    这是一个典型的例子,您不希望 doctrine 在每次更新模式时都生成这样的查询。

    DROP TABLE view_booking_by_customer_per_year; // NO I DONT WANT THIS
    

    所以使用 schema_filter 你可以告诉 doctrine 在他的验证和更新过程中忽略这个表。

    尝试使用原始 sql 创建一个随机表并使用 doctrine:schema:validate。 它将显示database is not in sync 错误。 一旦你把它放在 schema_filter 中,错误就不会再发生了。

    它适用于doctrine:migration:diffdoctrine:schema:update

    但是如果你想避免在数据库内部生成一个实体,那么可以从 Ernesto 的答案中的链接中找到这个:

     schema_ignore_classes:
       - ReferenceToMyClass
       - ReferenceToMyOtherClass
    

    仅在 Doctrine 2.7 版本后有效。 你可以在这里找到完整的例子:Ignore a Doctrine2 Entity when running schema-manager update

    我强烈建议您使用 doctrine:migration:diff 然后使用 doctrine:migration:migrate 而不是 doctrine:schema:update 来对数据库执行更改。这对本地开发人员来说没问题,但在生产中这是一个非常糟糕的做法。

    https://symfony.com/bundles/DoctrineMigrationsBundle/current/index.html

    并且;抱歉我之前回答的很短哈哈:)

    【讨论】:

    • @nboulfroy 这次用解决方案(我希望)重新更新了答案
    【解决方案2】:

    标有标志 readOnly=true 的实体不再跟踪更新,但仍然可以插入或删除行,如 documentation 中所述。

    doctrine:schema:update 命令仍会考虑表以更新模式。

    在问题"Ignore a Doctrine2 Entity when running schema-manager update" 的答案中,有 3 个有效选项可以忽略模式更新中的实体。

    【讨论】:

    • 此解决方案不起作用。即使我从“@ORMEntity”注解中删除了“readOnly”参数,表也会始终生成。
    • @nboulfroy “只读”属性允许实体在您修改对象然后执行 persistflush 时不更新。它不会影响使用 doctrine:schema:update 命令进行的模式更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-13
    • 2013-03-26
    相关资源
    最近更新 更多