”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 忽略 Doctrine DBAL 4 上的自定义索引

忽略 Doctrine DBAL 4 上的自定义索引

发布于2024-07-31
浏览:597

Ignore custom indexes on Doctrine DBAL 4

您可以使用实体文件上的 #[ORM\Index(fields: ['fieldName'] 属性创建数据库索引,Doctrine 将完成剩下的工作来为您管理索引,但是我不会谈论这个。

随着您的项目增长或需要特定要求,您可能需要使用自定义索引类型,如 GIST、GIN、BRIN 等 (https://www.postgresql.org/docs/current/indexes-types.html)。 Doctrine 不支持创建开箱即用的特定于数据库供应商的索引类型(参考)。

要解决此问题,您可以直接对数据库执行 CREATE INDEX DDL,或者将 DDL 写入到doctrine-migrations 文件中。后一个选项使您可以更轻松地部署或回滚更改。

无论您使用哪种方法创建自定义索引,Doctrine 都会将这些自定义索引始终标记为未映射索引,因此如果您执行 Doctrine:schema:validate 您将收到一个错误,指出如果您的数据库不同步,同样,在执行doctrine:schema:update --dump-sql 或doctrine:migrations:diff 时,它会显示 DROP INDEX ... 语句以删除自定义索引。

解决方案

我正在使用这些软件包版本。 (我相信该解决方案将适用于相同主要版本的软件包):

    学说/dbal 4.0.4
  • 学说/学说包 2.12.0
我找到了几个教程来处理这个问题,但并不令人满意:

    https://www.liip.ch/en/blog/doctrine-and- generated-columns 这不再起作用,因为 Doctrine DBAL 删除了 DBAL 4 上的事件管理器。(参考)
  • https://medium.com/yousign-engineering-product/ignore-custom-indexes-on-doctrine-dbal-b5131dd22071 这显示了一条弃用消息“platform_service”配置密钥自doctrine-bundle 2.9以来已弃用。 DBAL 4 将不再支持通过连接参数设置自定义平台。 (参考)
我在这里发现了一个关于 platform_service 配置替换的 GitHub 问题 https://github.com/doctrine/DoctrineBundle/issues/1656。

阅读这两页为我提供了有关如何通过 Doctrine 中间件使用自定义 DBAL 平台的所有信息:

    https://github.com/doctrine/dbal/pull/5699
  • https://symfony.com/bundles/DoctrineBundle/current/middlewares.html
最后,在深入研究源代码后,我找到了解决方案。您需要创建4个文件,其中2个文件是关于Doctrine中间件的,另外2个文件是关于Doctrine DBAL平台和模式的。

根据需要修改命名空间和类名。

真, 'index_name_2' => 真, ]; #[\覆盖] 受保护函数 _getPortableTableIndexesList(数组 $tableIndexes, 字符串 $tableName): 数组 { $indexes = 父级::_getPortableTableIndexesList($tableIndexes, $tableName); foreach (array_keys($indexes) as $indexName) { if (isset(self::IGNORED_INDEXES[$indexName])) { 取消设置($indexes[$indexName]); } } 返回$索引; } }
 true,
        'index_name_2' => true,
    ];

    #[\Override]
    protected function _getPortableTableIndexesList(array $tableIndexes, string $tableName): array
    {
        $indexes = parent::_getPortableTableIndexesList($tableIndexes, $tableName);

        foreach (array_keys($indexes) as $indexName) {
            if (isset(self::IGNORED_INDEXES[$indexName])) {
                unset($indexes[$indexName]);
            }
        }

        return $indexes;
    }
}
版本声明 本文转载于:https://dev.to/indragunawan/ignore-custom-indexes-on-doctrine-dbal-4-387j?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 大批
    大批
    方法是可以在对象上调用的 fns 数组是对象,因此它们在 JS 中也有方法。 slice(begin):将数组的一部分提取到新数组中,而不改变原始数组。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index p...
    编程 发布于2024-12-21
  • 将 Azure SQL 数据库升级到 v12 后,为什么会出现 TLS 握手错误?
    将 Azure SQL 数据库升级到 v12 后,为什么会出现 TLS 握手错误?
    v12 升级后 Azure SQL 数据库 TLS 握手错误Azure SQL 数据库实例升级到 v12 后,您可能会遇到 TLS 握手错误。当服务器提供的证书与客户端连接字符串中指定的主机名不匹配时,就会发生此错误。错误详细信息错误消息通常表明证书对于客户端连接中使用的主机名以外的主机名有效。例如...
    编程 发布于2024-12-21
  • 如何处理 SQL 数据库中多个表的外键关系?
    如何处理 SQL 数据库中多个表的外键关系?
    处理多个表的外键您有三个表:地区、国家和州。国家和国家可以属于地区,形成等级结构。现在,您想要创建一个包含“region_id”和“popular_place_id”列的“popular_areas”表,并基于“popular_place_type”列在“popular_place_id”与国家或州...
    编程 发布于2024-12-21
  • Go 是否为 Goroutine 特定数据提供 ThreadLocal 等效项?
    Go 是否为 Goroutine 特定数据提供 ThreadLocal 等效项?
    了解 Go 中的 Goroutine-本地存储在使用 Go 时,开发者经常会遇到需要跟踪与特定 Goroutine 相关的信息的情况。在 Java 等其他语言中,ThreadLocal 为该任务提供了一个优雅的解决方案。 Go 是否提供类似的机制?Go 的 Goroutine 本地存储方法Go 的标...
    编程 发布于2024-12-21
  • Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta:列偏移的删除和恢复Bootstrap 4 在其 Beta 1 版本中引入了重大更改柱子偏移了。然而,随着 Beta 2 的后续发布,这些变化已经逆转。从 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    编程 发布于2024-12-21
  • 在 Go 中使用 WebSocket 进行实时通信
    在 Go 中使用 WebSocket 进行实时通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSocke...
    编程 发布于2024-12-21
  • 如何使用 Prototype.js 实现自动调整文本区域大小的功能?
    如何使用 Prototype.js 实现自动调整文本区域大小的功能?
    使用 Prototype 实现自动调整大小的 TextArea要增强内部销售应用程序中的用户体验,请考虑向用于送货地址的文本区域。以下是实现此目的的详细指南:目标是创建一个可以动态调整其高度以适应文本输入的文本区域,确保最佳的空间利用率和可读性。为此,我们将利用 JavaScript 框架 Prot...
    编程 发布于2024-12-21
  • Spring Boot如何配置多个数据源?
    Spring Boot如何配置多个数据源?
    在Spring Boot中配置多个数据源在Spring Boot中,使用多个数据源可以让你隔离不同实体的数据访问管理或应用程序。为了实现这一点,使用了 application.properties 文件和 Bean 配置方法。application.properties要添加第二个数据源,请在 ap...
    编程 发布于2024-12-21
  • 为什么 C++ 中的零长度数组会导致错误 2233,如何修复它?
    为什么 C++ 中的零长度数组会导致错误 2233,如何修复它?
    在 C 中处理“零长度数组” 在 C 中,在遗留代码中可能会遇到“零长度数组”的情况。这涉及包含长度为零的数组的结构。虽然警告被编译指示抑制,但创建包含此类数组的新结构可能会导致错误 2233。为什么会发生这种情况,可以采取什么措施来解决它?使用零长度数组的原因是一个历史原因允许动态分配数组的 C ...
    编程 发布于2024-12-21
  • 如何设置 HTML `` 标签的样式并确保其可见性?
    如何设置 HTML `` 标签的样式并确保其可见性?
    HTML标签的样式和可见性问题声明在HTML中,标签用于定义一个区域可以链接到另一个资源的图像。然而,用户在设计样式并使这些区域始终可见方面遇到了困难。jQuery 插件解决方案克服这一挑战的一种方法是利用 MapHilight jQuery 插件。该插件提供了使用 CSS 悬停效果突出显示图像地图...
    编程 发布于2024-12-21
  • 除了“if”语句之外:还有哪些地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    除了“if”语句之外:还有哪些地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    无需强制转换即可上下文转换为 bool您的类定义了对 bool 的显式转换,使您能够在条件语句中直接使用其实例“t”。然而,这种显式转换提出了一个问题:“t”在哪里可以在不进行强制转换的情况下用作 bool?上下文转换场景C 标准指定了四种值可以根据上下文转换为的主要场景bool:语句:if、whi...
    编程 发布于2024-12-21
  • 访问类中的数据库对象时如何避免全局变量?
    访问类中的数据库对象时如何避免全局变量?
    在类中使用全局变量创建分页功能涉及从类中访问数据库对象。但是,尝试访问类内部的外部变量可能会导致错误。让我们深入研究处理此问题的可能解决方案。为了解决致命错误“在非对象上调用成员函数 query()”,数据库对象需要在类中可访问。不使用全局变量,更合适的方法是将数据库对象注入到类或其方法中。依赖注入...
    编程 发布于2024-12-21
  • 如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 识别今天生日的用户使用 MySQL 确定今天是否是用户的生日涉及查找生日匹配的所有行今天的日期。这可以通过一个简单的 MySQL 查询来实现,该查询将存储为 UNIX 时间戳的生日与今天的日期进行比较。以下 SQL 查询将获取今天有生日的所有用户: FROM USERS ...
    编程 发布于2024-12-21
  • 如何在C++中生成特定范围内均匀分布的随机数?
    如何在C++中生成特定范围内均匀分布的随机数?
    跨范围均匀随机数生成您寻求一种在指定范围[min, max]内均匀生成随机数的方法。 rand 的缺陷您当前使用 rand() 和模运算符的实现可能无法确保均匀分布,因为它的行为取决于 RAND_MAX 和范围本身。C 11 和统一范围生成在 C 11 中,std::uniform_int_dist...
    编程 发布于2024-12-21
  • 如何在 Jackson 序列化期间抑制空字段值?
    如何在 Jackson 序列化期间抑制空字段值?
    处理 Jackson 序列化中的空字段值Jackson 是一个流行的 Java 序列化库,提供了各种配置选项来定制其序列化行为。一种常见的情况是抑制空字段值的序列化。这可确保序列化输出中仅包含非空属性。配置 Jackson 进行空值抑制指示 Jackson 忽略 null 有两种主要方法序列化期间的...
    编程 发布于2024-12-21

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3