Symfony 5 - schema_filter 的原则不起作用

NBo*_*roy 1 php doctrine symfony symfony4 symfony5

当我在项目中执行命令行时,我尝试忽略两个实体,doctrine:schema:update --force其写法如下:

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

在我的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_)~
        # ...
Run Code Online (Sandbox Code Playgroud)

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

项目配置:

  • 交响乐 5.4.14
  • PHP 7.4.26
  • 学说:形式:2.13.3
  • 学说/注释:1.13.3
  • 学说/学说包:2.7.0
  • 学说/学说迁移捆绑包:3.2.2
  • symfony/doctrine-bridge:5.4.14
  • 学说/数据固定装置:1.5.3

Tho*_*asL 6

架构过滤器

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

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

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

DROP TABLE view_booking_by_customer_per_year; // NO I DONT WANT THIS
Run Code Online (Sandbox Code Playgroud)

因此,使用schema_filter您可以告诉主义在其验证和更新过程中忽略此表。

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

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

schema_ignore_class

但是,如果您想避免在数据库内生成实体,则可以从 Ernesto 的答案中的链接中找到以下内容:

 schema_ignore_classes:
   - Reference\To\My\Class
   - Reference\To\My\OtherClass
Run Code Online (Sandbox Code Playgroud)

仅自 Doctrine 2.7 版本起有效。您可以在此处找到完整的示例:Ignore a Doctrine2 Entity when running schema-manager update

使用学说迁移

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

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