intaro / custom-index-bundle
Annotation and command for control entity custom indexes
Installs: 504 261
Dependents: 0
Suggesters: 0
Security: 0
Stars: 27
Watchers: 14
Forks: 15
Open Issues: 1
Type:symfony-bundle
Requires
- php: ^8.1
- doctrine/orm: ^2.2.3 || ^3.0
- symfony/config: ^5.0 || ^6.0
- symfony/console: ^5.0 || ^6.0
- symfony/dependency-injection: ^5.0 || ^6.0
- symfony/http-kernel: ^5.0 || ^6.0
- symfony/validator: ^5.0 || ^6.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.59
- phpstan/phpstan: ^1.11
- retailcrm/php-code-style: ^1.0
README
The CustomIndexBundle allows create index for doctrine entities using attribute with entity definition and console command.
Installation
CustomIndexBundle requires Symfony 5 or higher. Works only with PostgreSQL.
Run into your project directory:
$ composer require intaro/custom-index-bundle
Register the bundle in config/bundles.php
:
<?php return [ ... Intaro\CustomIndexBundle\IntaroCustomIndexBundle::class => ['all' => true], ];
If your project have many schemas in single database and command must generate custom indexes only for one schema then add in your config.yml
:
intaro_custom_index: search_in_all_schemas: false allowed_index_types: ['gin', 'gist', 'btree', 'hash']
Default value of search_in_all_schemas
is true
.
If you have different entities in different schemas and you need to update custom indexes in all schemas at once then you must set search_in_all_schemas
to true
or omit this config.
If you have database with only public schema then search_in_all_schemas
value doesn't matter.
Parameter allowed_index_types
helps to exclude some types of indexes. If someone will try to use excluded type, command intaro:doctrine:index:update
will return an error.
Default value is ['gin', 'gist', 'btree', 'hash']
.
Usage
- Add attributes in your entity
<?php namespace Acme\MyBundle\Entity; use Doctrine\ORM\Mapping as ORM; use Intaro\CustomIndexBundle\Metadata\Attribute\CustomIndex; #[ORM\Table(name:'my_entity')] #[ORM\Entity] #[CustomIndex(columns: ['my_property1'])] #[CustomIndex(columns: ['lower(my_property1)', 'lower(my_property2)'])] class MyEntity { #[ORM\Column(type:'string', length: 256)] private $myProperty1; #[ORM\Column(type:'string', length: 256)] private $myProperty2; }
Available CustomIndex properties:
columns
- array of the table columnsname
- index name (default ='i_cindex_<md5 hash from all CustomIndex attributes>'
).unique
- index is unique (default = false).using
- corresponds toUSING
directive in PostgreSQLCREATE INDEX
command.where
- corresponds toWHERE
directive in PostgreSQLCREATE INDEX
command.
Required only columns
property.
- Use
intaro:doctrine:index:update
command for update db.
php app/console intaro:doctrine:index:update
You may use dump-sql
parameter for dump sql with DROP/CREATE INDEX
commands
php app/console intaro:doctrine:index:update --dump-sql
Examples
Create index using pg_trgm
extension:
<?php #[CustomIndex(columns: ['lower(my_column) gist_trgm_ops'], using: 'gist')]
Create unique index using PostgreSQL functions:
<?php #[CustomIndex(columns: ['lower(my_column1)', 'nullif(true, not my_column2 isnull)'], unique: true)]
Create partial index:
<?php #[CustomIndex(columns: ['site_id'], where: 'product_id IS NULL')]