Symfony 5 - Doctrine 的 schema_filter 无法正常工作
P粉002023326
P粉002023326 2023-08-26 18:16:28
[PHP讨论组]

当我在我的项目中执行命令行 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_)~
        # ...

Doctrine 不断生成所有实体,而我的视图位于 schema_filter 中。你对此有何解释?这是我第一次在项目中使用此选项。

项目设置:

  • Symfony 5.4.14
  • PHP 7.4.26
  • 教义:orm:2.13.3
  • 理论/注释:1.13.3
  • 学说/学说包:2.7.0
  • 学说/学说迁移包:3.2.2
  • symfony/doctrine-bridge:5.4.14
  • 理论/数据装置:1.5.3

P粉002023326
P粉002023326

全部回复(2)
P粉186897465

An entity marked with the flag readOnly=true is not tracked for updates anymore but it is still possible to insert or delete rows, as explained in the documentation.

The doctrine:schema:update command will still take the table into account to update the schema.

在问题的答案中“忽略 Doctrine2 实体运行架构管理器更新时” 有 3 个有效选项可以忽略架构更新中的实体。

P粉455093123

schema_filter

schema_filter is not made to "filter" entity but to filter db table from doctrine awareness.

这是一个示例:
Assuming you manually create a table that is updated from a custom raw php cronjob called view_booking_by_customer_per_year, this table is not used by your code in your project but is used for data analysis.

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

DROP TABLE view_booking_by_customer_per_year; // NO I DONT WANT THIS

So using schema_filter you can tell doctrine to ignore this table in his validation and update process.

Try to create a random table using raw sql and use doctrine:schema:validate. It will show database is not in sync error. 一旦将其放入 schema_filter 中,错误就不会再发生。

It work for doctrine:migration:diff and doctrine:schema:update

schema_ignore_class

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

schema_ignore_classes:
   - Reference\To\My\Class
   - Reference\To\My\OtherClass

仅从 Doctrine 2.7 版本开始工作。 您可以在这里找到完整的示例: 运行架构管理器更新时忽略 Doctrine2 实体

使用学说迁移

I strongly advise you to use doctrine:migration:diff then doctrine:migration:migrate instead of doctrine:schema:update to perform change on database. It's ok for local dev, but when in production it is a very bad practice.

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号