Как указать Doctrine НЕ создавать индекс

У меня есть этот простой объект, например:

<?php

namespace App\Entity\Creator;

use App\Repository\Creator\ActivityContactRepository;
use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity(repositoryClass: ActivityContactRepository::class)]
#[ORM\Index(columns: ['contact_id'])]
class ActivityContact
{
    #[ORM\Id]
    #[ORM\ManyToOne(targetEntity: Activity::class, cascade: ['persist'])]
    private Activity $activity;

    #[ORM\Id]
    #[ORM\Column(name: 'contact_id', type: 'integer')]
    private int $contactId;

    public function __construct(Activity $activity, int $contactId)
    {
        $this->activity = $activity;
        $this->contactId = $contactId;
    }

    public function getActivity(): Activity
    {
        return $this->activity;
    }

    public function setActivity(Activity $activity): void
    {
        $this->activity = $activity;
    }

    public function getContactId(): int
    {
        return $this->contactId;
    }
}

Когда я создаю миграцию «diff», доктрина автоматически создает запрос на добавление INDEX MariaDB для столбца «activity_id».

В моем случае этот индекс бесполезен и я хотел бы его убрать, а не просто удалять из миграции.

Есть ли способ указать, чтобы не создавать этот индекс?

Спасибо,

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
4
0
139
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Удалите атрибут #[ORM\Index(...)] над определением имени класса. Хотя вы включаете это свойство в идентификатор объекта, индекс может быть создан по столбцу.

Этот индекс мне нужен. Мне не нужен тот, который автоматически создается для отношения $activity ManyToOne.

TEOL 27.01.2023 10:40

Но когда вы создаете отношения, конечно, создается индекс. Это что-то типичное для системы управления базами данных.

Francisco 28.01.2023 01:53

Да, я знаю, спасибо, но в моем конкретном случае этот столбец также является ПЕРВИЧНЫМ ключом, поэтому добавление ИНДЕКС поверх него бесполезно и зря использует память.

TEOL 30.01.2023 11:24

@TEOL Я думаю, что единственный вариант, который вам нужен, - это вручную добавить SQL-запрос относительно индекса отбрасывания в файл миграции. В Doctrine нет доступных опций.

Ответ принят как подходящий

Краткий ответ: нет, вы не можете.

Индекс в поле activity_id создается, поскольку у вас есть отношение ManyToOne, и необходимо добавить внешний ключ, поэтому создается индекс, чтобы создать на нем внешний ключ, и вы не можете отменить это поведение.

Тогда у вас будет один первичный индекс с activity_id и contact_id и еще один индекс для activity_id с внешним ключом.

Да, вы можете использовать первичный индекс для хранения внешнего ключа, но доктрина его не использует (насколько мне известно).

Если вы хотите избавиться от этого индекса, вы должны удалить отношение ManyToOne. Вы можете создать поле с именем $activity_id, а затем вам придется вручную получить объект действия, если вы хотите его получить.

Не беспокойтесь об используемой им памяти, если у вас есть проблемы с памятью, я могу заверить вас, что созданный индекс не будет источником проблем.

Кроме того, если вы используете миграции доктрины, не удаляйте создание индекса в файле миграции, потому что он будет создаваться снова и снова при каждом созданном вами diff.

Я тоже так думал, но я не смог найти никакой документации, подтверждающей мое предположение, у вас есть идеи, где я могу это найти?

hugo schweitzer 02.02.2023 12:14

Я искал и не нашел никакой «официальной» документации, в которой это говорится, но отсутствие какой-либо информации об этом заставляет меня чувствовать, что то, что вы хотите, невозможно настроить.

David Rojo 03.02.2023 15:51

Меня нет дома, поэтому я не могу это проверить, но не могли бы вы попробовать следующее: на уровне класса добавьте @ORM\Table и установите его индексы в пустой массив. Затем над вашим свойством $contactId добавьте ORM\Index(columns: ['contact_id'])

<?php

namespace App\Entity\Creator;

use App\Repository\Creator\ActivityContactRepository;
use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity(repositoryClass: ActivityContactRepository::class)]
#[ORM\Table(indexes: [])]
class ActivityContact
{
    #[ORM\Id]
    #[ORM\ManyToOne(targetEntity: Activity::class, cascade: ['persist'])]
    private Activity $activity;

    #[ORM\Id]
    #[ORM\Column(name: 'contact_id', type: 'integer')]
    #[ORM\Index(columns: ['contact_id'])]
    private int $contactId;

    public function __construct(Activity $activity, int $contactId)
    {
        $this->activity = $activity;
        $this->contactId = $contactId;
    }

    public function getActivity(): Activity
    {
        return $this->activity;
    }

    public function setActivity(Activity $activity): void
    {
        $this->activity = $activity;
    }

    public function getContactId(): int
    {
        return $this->contactId;
    }
}

Другие вопросы по теме