如何指定 Doctrine NOT 创建索引

TEO*_*EOL 5 php doctrine mariadb symfony doctrine-orm

例如,我有这个简单的实体:

<?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;
    }
}
Run Code Online (Sandbox Code Playgroud)

当我生成“diff”迁移时,学说会自动创建一个查询来为“activity_id”列添加 MariaDB INDEX。

就我而言,该索引没有用,我想将其删除,而不仅仅是从迁移中删除它。

有没有办法指定不创建这个索引?

谢谢,

Dav*_*ojo 4

简短的回答:不,你不能。

由于您具有 ManyToOne 关系并且必须添加外键,因此正在创建 Activity_id 字段中的索引,这就是创建索引并在其上创建外键的原因,并且您无法撤消此行为。

然后,您将拥有一个包含 Activity_id 和 contact_id 的主索引,以及另一个带有外键的 Activity_id 索引。

是的,您可以使用主索引来保存外键,但原则不使用它(据我所知)。

如果你想删除这个索引,你必须删除ManyToOne关系。您可以创建一个名为 $activity_id 的字段,然后如果您想检索它,则必须手动获取活动实体。

不用担心它使用的内存,如果您有内存问题,我可以向您保证创建的索引不会是问题的根源。

另外,如果您正在使用学说迁移,请不要删除迁移文件中索引的创建,因为它将在您生成的每个差异上一次又一次地生成。