«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Игнорировать пользовательские индексы в Doctrine DBAL 4

Игнорировать пользовательские индексы в Doctrine DBAL 4

Опубликовано 31 июля 2024 г.
Просматривать:928

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 в файл Doctory-migrations. Последний вариант упрощает развертывание или откат изменений.

Независимо от того, какой метод вы используете для создания пользовательского индекса, Doctrine всегда будет помечать эти пользовательские индексы как несопоставленные индексы, поэтому, если вы выполните Doctry:schema:validate, вы получите сообщение об ошибке, сообщающее, что ваша база данных не синхронизирована, то же самое при выполнении Doctor:schema:update --dump-sql или Doction:migrations:diff покажет вам оператор DROP INDEX ... для удаления пользовательских индексов.

Решение

Я использую эти версии пакета. (Я считаю, что решение будет работать с той же основной версией пакетов):

  • доктрина/dbal 4.0.4
  • доктрина/doctrine-bundle 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» устарел, начиная с пакета доктрины 2.9. DBAL 4 больше не будет поддерживать настройку пользовательской платформы через параметры подключения. (ссылка)

Я нашел проблему GitHub, связанную с заменой конфигурации Platform_service, здесь https://github.com/doctrine/DoctrineBundle/issues/1656.

Прочитав эти две страницы, я получил всю информацию о том, как использовать собственную платформу DBAL через промежуточное программное обеспечение Doctrine:

  • https://github.com/doctrine/dbal/pull/5699
  • https://symfony.com/bundles/DoctrineBundle/current/middlewares.html

Наконец, покопавшись в исходном коде, я нашел решение. Вам необходимо создать 4 файла: 2 файла относятся к промежуточному программному обеспечению Doctrine и 2 других файла относятся к платформе и схеме Doctrine DBAL.

Измените пространство имен и имя класса по своему усмотрению.



















 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], чтобы удалить их.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3