Длина индекса в Doctrine ORM

#php #doctrine-orm #doctrine

#php #doctrine-orm #доктрина

Вопрос:

У меня есть устаревшее приложение, в котором у меня есть таблица, определение создания которой выглядит следующим образом:

 CREATE TABLE my_schema.shops_urls (
   id BIGINT UNSIGNED NOT NULL,
   id_shop INT UNSIGNED NOT NULL,
   url VARCHAR(2000) NOT NULL, 
   
   PRIMARY KEY (id, id_shop),
   INDEX url (url),
   INDEX id_shop_url (id_shop, url) 
) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB';
 

Устаревшее приложение обновляется и переносится на Symfony. Следовательно, таблица / сущность

 /**
 * ShopsUrls
 *
 * @ORMEntity(repositoryClass=ShopsUrlsRepository::class)
 * @ORMTable(
 *      name="shops_urls",
 *      schema="my_schema",
 *      indexes={
 *          @ORMIndex(name="url", columns={"url"}),
 *          @ORMIndex(name="id_shop_url", columns={"id_shop","url"})
 *      }
 * )
 */
class ShopsUrls
{
    /**
     * @var int|null
     * 
     * @ORMColumn(name="id", type="bigint", nullable=false, options={"unsigned":true})
     * @ORMId
     * @ORMGeneratedValue(strategy="NONE")
     */
    private ?int $id;

    /**
     * @var int|null
     * 
     * @ORMColumn(name="id_shop", type="integer", nullable=false, options={"unsigned":true})
     * @ORMId
     * @ORMGeneratedValue(strategy="NONE")
     */
    private ?int $id_shop;

    /**
     * @var string|null
     * 
     * @ORMColumn(name="url", type="string", length=2000, nullable=false)
     */
    private ?string $url;
}
 

При выполнении $ bin/console doctrine:schema:update --force отображаются следующие ошибки:

SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 3072 bytes

Выполнение приведенного выше SQL выдает ту же ошибку. Если мы изменим индексы следующим образом, SQL будет выполнен без ошибок (следовательно, таблица, если она создана).

    INDEX url (url(100)),
   INDEX id_shop_url (id_shop, url(100))
 

Вопрос

Есть ли способ указать длину индекса в аннотациях Doctrine? Что-то вроде:

  * @ORMTable(
 *      name="shops_urls",
 *      schema="my_schema",
 *      indexes={
 *          @ORMIndex(name="url", columns={"url(100)"}),
 *          @ORMIndex(name="id_shop_url", columns={"id_shop","url(100)"})
 *      }
 * )
 

Выполнение $ bin/console doctrine:schema:update --force выдает следующую ошибку:

There is no column with name 'url(100)' on table 'shops_urls'.

Комментарии:

1. Есть решение: параметры и «длины» @ORMIndex(имя = «url», столбцы = {«url»}, параметры ={«длины» = {100}}), @ORMIndex(имя = «id_shop_url», столбцы = {«id_shop», «url»}, options={«lengths»={null,100}})

Ответ №1:

Вам нужно указать длину индекса в третьем аргументе options ORMIndex аннотации.

 @ORMIndex(name="url", columns={"url(100)"}, options={"lengths": {100}})
 

или в виде списка для комбинированного индекса

 @ORMIndex(name="id_shop_url", columns={"id_shop", "url"}, options={"lengths": {10, 100}})
 

установите значение null для тех полей, которые вы хотите полностью проиндексировать

 @ORMIndex(name="id_shop_url", columns={"id_shop", "url"}, options={"lengths": {null, 100}})