「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Doctrine DBAL 4 のカスタムインデックスを無視する

Doctrine DBAL 4 のカスタムインデックスを無視する

2024 年 7 月 31 日に公開
ブラウズ:271

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 は、すぐに使えるデータベースベンダー固有のインデックスタイプの作成をサポートしていません (ref)。

この問題に取り組むには、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 のイベント マネージャーを削除したため、これは機能しなくなりました。(ref)
  • https://medium.com/yousign-engineering-product/ignore-custom-indexes-on-doctrine-dbal-b5131dd22071 これは非推奨メッセージを示していました。「platform_service」設定キーは doctrine-bundle 2.9 以降非推奨になりました。 DBAL 4 では、接続パラメータによるカスタム プラットフォームの設定はサポートされなくなります。 (参照)

ここ https://github.com/doctrine/DoctrineBundle/issues/1656 で platform_service 構成の置換に関する GitHub の問題を見つけました。

これらの 2 ページを読むことで、Doctrine ミドルウェアを通じてカスタム DBAL プラットフォームを使用する方法に関するすべての情報が得られました。

  • 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