응용 프로그램을 만들고 모델에 ORM을 사용할 계획 이었지만 실제로는 Entity-Attribute-Value 테이블을 사용하는 데이터베이스의 일부가 있습니다.EAV 테이블의 Doctrine ORM
Doctrine ORM은 꽤 좋아하지만 테이블이 실제로 EAV 스타일 인 경우 일반 교리 항목처럼 보이는 클래스를 만들 수 있는지 여부는 알 수 없습니다.
Doctrine을 사용할 수 있습니까? 그렇다면 어떻게해야합니까?
응용 프로그램을 만들고 모델에 ORM을 사용할 계획 이었지만 실제로는 Entity-Attribute-Value 테이블을 사용하는 데이터베이스의 일부가 있습니다.EAV 테이블의 Doctrine ORM
Doctrine ORM은 꽤 좋아하지만 테이블이 실제로 EAV 스타일 인 경우 일반 교리 항목처럼 보이는 클래스를 만들 수 있는지 여부는 알 수 없습니다.
Doctrine을 사용할 수 있습니까? 그렇다면 어떻게해야합니까?
doctrine을 사용하는 entity
와 attribute
사이의 관계. 가장 복잡한 경우에는 Many to Many 관계를 처리합니다.
따라서 Name
속성을 User
엔티티에 매핑한다고 가정 해 보겠습니다. 사용자가 정확히 하나의 이름을 가지고 있으며, 각각의 이름이 정확히 하나의 사용자가이 링크 attribute
와 value
사이의 관계를 모델링하는 One to One 관계
name
및 phone_number
속성을 고려하십시오. 이름은 문자열로 표시 될 수 있지만 전화 번호에는 정수가 필요할 수 있습니다. 또는 번호뿐 아니라 지역 코드도 별도의 필드에 작성해야합니다.
EAV는 매우 유연한 값 표현이 필요하기 때문에 데이터베이스 테이블의 동일한 필드에 모든 값을 저장할 수 없습니다 (BLOB는 무시하고 데이터 직렬화는 무시하십시오). 따라서 대부분의 EAV 구현은 서로 다른 값 유형을 나타내는 서로 다른 테이블을 사용합니다.
이러한 유연성에 도달하기 위해 교리는 Inheritance Mapping입니다. 기본적으로 당신은 교리 실체를 확장 할 수 있습니다.
/**
* @Entity
* @InheritanceType("JOINED")
* @DiscriminatorColumn(name="value_type", type="string")
* @DiscriminatorMap({"name" = "Name", "phone" = "PhoneNumber"})
*/
class Value
{
// ...
}
/** @Entity */
class Name extends Value
{
// ...
}
/** @Entity */
class PhoneNumber extends Value
{
// ...
}
Value
클래스 즉 ID를 모든 값에 대한 일반적인 구현을 제공합니다 : 당신이 당신의 엔티티의 각 하위 유형에 대한 discriminator
을 지정 이렇게. 각 하위 클래스 (예 : Name
및 PhoneNumber
)는 이러한 공통 값을 특정 필드 (예 : 추가 입력란)로 확장합니다.
@DiscriminatorColumn
은 값의 유형을 저장하는 상위 관계의 열을 정의합니다.@DiscriminatorMap
은 유형을 @DiscriminatorColumn
에서 해당 클래스 중 하나로 매핑하기 위해 doctrine에서 사용됩니다.attribute
과 value
사이의 관계를 상위 클래스에 지정할 수 있습니다. 그런 다음 속성에서 값을 호출하면 런타임 중에 필터링 할 수있는 모든 유형의 값 (예 : instanceof)을 가져옵니다.
상자 밖으로, 나는 그것을 의심한다. 아마 당신은 자신의 구현을 롤백 할 수 있습니다. Doctrine은 꽤 확장 가능합니다. – ZolaKt
값에 따른 테이블 관계 (데이터 유형에 따라 올바른 속성 - 값 테이블에 참여)가 불가능하므로 (아는 바는) Doctrine을 사용하여이를 수행하는 것은 매우 까다로운 일입니다. –