У меня есть этот простой объект, например:
<?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».
В моем случае этот индекс бесполезен и я хотел бы его убрать, а не просто удалять из миграции.
Есть ли способ указать, чтобы не создавать этот индекс?
Спасибо,






Удалите атрибут #[ORM\Index(...)] над определением имени класса. Хотя вы включаете это свойство в идентификатор объекта, индекс может быть создан по столбцу.
Но когда вы создаете отношения, конечно, создается индекс. Это что-то типичное для системы управления базами данных.
Да, я знаю, спасибо, но в моем конкретном случае этот столбец также является ПЕРВИЧНЫМ ключом, поэтому добавление ИНДЕКС поверх него бесполезно и зря использует память.
@TEOL Я думаю, что единственный вариант, который вам нужен, - это вручную добавить SQL-запрос относительно индекса отбрасывания в файл миграции. В Doctrine нет доступных опций.
Краткий ответ: нет, вы не можете.
Индекс в поле activity_id создается, поскольку у вас есть отношение ManyToOne, и необходимо добавить внешний ключ, поэтому создается индекс, чтобы создать на нем внешний ключ, и вы не можете отменить это поведение.
Тогда у вас будет один первичный индекс с activity_id и contact_id и еще один индекс для activity_id с внешним ключом.
Да, вы можете использовать первичный индекс для хранения внешнего ключа, но доктрина его не использует (насколько мне известно).
Если вы хотите избавиться от этого индекса, вы должны удалить отношение ManyToOne. Вы можете создать поле с именем $activity_id, а затем вам придется вручную получить объект действия, если вы хотите его получить.
Не беспокойтесь об используемой им памяти, если у вас есть проблемы с памятью, я могу заверить вас, что созданный индекс не будет источником проблем.
Кроме того, если вы используете миграции доктрины, не удаляйте создание индекса в файле миграции, потому что он будет создаваться снова и снова при каждом созданном вами diff.
Я тоже так думал, но я не смог найти никакой документации, подтверждающей мое предположение, у вас есть идеи, где я могу это найти?
Я искал и не нашел никакой «официальной» документации, в которой это говорится, но отсутствие какой-либо информации об этом заставляет меня чувствовать, что то, что вы хотите, невозможно настроить.
Меня нет дома, поэтому я не могу это проверить, но не могли бы вы попробовать следующее: на уровне класса добавьте @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;
}
}
Этот индекс мне нужен. Мне не нужен тот, который автоматически создается для отношения $activity ManyToOne.