programing

인덱스를 생성하지 않도록 Doctrine에 지정하는 방법

newsource 2023. 5. 5. 09:44

인덱스를 생성하지 않도록 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" 마이그레이션을 생성하면 "activity_id" 열에 대한 MariaDB INDEX를 추가하는 쿼리가 자동으로 생성됩니다.

이 인덱스는 유용하지 않으므로 마이그레이션에서 삭제하지 않고 제거하려고 합니다.

이 인덱스를 만들지 않도록 지정하는 방법이 있습니까?

감사해요.

단답:아니, 그럴 수 없다.

ManyToOne 관계가 있을 때 activity_id 필드의 인덱스가 생성되고 있으며 외부 키를 추가해야 하므로 인덱스를 생성하여 외부 키를 생성할 수 있으며 이 동작을 취소할 수 없습니다.

그러면 activity_id 및 contact_id가 포함된 기본 인덱스와 외부 키가 포함된 activity_id에 대한 인덱스가 하나씩 생성됩니다.

네, 기본 인덱스를 사용하여 외부 키를 보유할 수 있지만, 독트린은 사용하지 않는 것으로 알고 있습니다(제가 알기로는).

이 인덱스를 제거하려면 MultiToOne 관계를 제거해야 합니다.$activity_id라는 필드를 만든 다음 작업 엔티티를 검색하려면 수동으로 가져와야 합니다.

메모리에 사용되는 메모리에 대해 걱정하지 마십시오. 메모리에 문제가 있는 경우 생성된 인덱스가 문제의 원인이 되지 않을 것임을 보장할 수 있습니다.

또한 독트린 마이그레이션을 사용하는 경우에는 마이그레이션 파일에서 인덱스를 만드는 작업을 제거하지 마십시오. 인덱스는 생성되는 각 디프에서 계속해서 생성됩니다.

@TEOL 마이그레이션 파일의 삭제 인덱스에 대한 SQL 쿼리를 수동으로 추가하는 것이 유일한 옵션이라고 생각합니다.독트린에서 사용할 수 있는 옵션이 없습니다.

특성 제거#[ORM\Index(...)]클래스 이름 정의 위에 있습니다.해당 속성을 엔티티의 ID에 포함하는 경우에도 인덱스는 열 위에 생성될 수 있습니다.

제가 집에 없어서 이것을 테스트할 수는 없지만 다음을 시도해 주시겠어요: 클래스 수준에서 @ORM\Table 추가하고 인덱스를 빈 배열로 설정하십시오.그런 다음 $contactId 속성 위에 ORM\Index(열: ['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;
    }
}

언급URL : https://stackoverflow.com/questions/75247595/how-to-specify-to-doctrine-not-to-create-an-index