내 생각 엔 개발자가 "일반적인"엔터티 / 모델을 구현할 수있는 레거시이며 "편의성"패턴이라고 생각합니다.
언급했듯이 관련 테이블은 일반적으로 비어 있습니다. 핵심 EAV 엔터티가이 "기본"엔터티 테이블 구조를 사용하지 않기 때문입니다. 다음은 1.8 설치의 엔티티 테이블입니다.
mysql> select distinct(entity_table) from eav_entity_type;
+-------------------------+
| entity_table |
+-------------------------+
| customer/entity |
| customer/address_entity |
| sales/order |
| sales/order_entity |
| catalog/category |
| catalog/product |
| sales/quote |
| sales/quote_address |
| sales/quote_entity |
| sales/quote_item |
| sales/invoice |
+-------------------------+
11 rows in set (0.00 sec)
예를 들어 고객 모델을 사용하여, 우리는 자원 모델이 있음을 알 수 Mage_Customer_Model_Resource_Customer
확장 Mage_Eav_Model_Entity_Abstract
, 소스 .
참고 : 고객 기업에 대한 이전 1.6 자원 모델이되었다 Mage_Customer_Model_Entity_Customer
또한 확장하는 Mage_Eav_Model_Entity_Abstract
, 소스 .
Mage_Eav_Model_Entity_Abstract
클래스를 살펴보면 getEntityTable
메소드 가 발견 됩니다. 이 방법은 일반적인 CRUD 작업 중에 쿼리를 작성할 때 사용할 테이블을 결정하는 데 사용됩니다. 관심있는 다른 방법은 getValueTablePrefix
입니다. 이 데이터 "타입"테이블에 대한 테이블 접두사 결정 *_datetime
, *_decimal
, *_varchar
등이있다.
해당 메소드의 소스를 엿보기 ( here 및 here ).
public function getEntityTable()
{
if (!$this->_entityTable) {
$table = $this->getEntityType()->getEntityTable();
if (!$table) {
$table = Mage_Eav_Model_Entity::DEFAULT_ENTITY_TABLE;
}
$this->_entityTable = Mage::getSingleton('core/resource')->getTableName($table);
}
return $this->_entityTable;
}
위의 방법에서 엔티티 유형이 사용자 정의 테이블을 정의하지 않으면 기본값이로 설정되어 있음을 알 수 Mage_Eav_Model_Entity::DEFAULT_ENTITY_TABLE
있습니다. 해당 상수의 값은입니다 ( 'eav/entity'
이것은 차례로 eav_entity
테이블 로 바뀝니다 (응용 프로그램에 구성된 테이블 접두사가 없다고 가정)). 내가 언급 한 두 번째 방법은 주어진 엔티티에 대해 아무것도 구성되지 않은 경우이 테이블에서 접두사로 대체됩니다. 열의 eav_entity_type
표 값을 검사하면 모두 값 value_table_prefix
임을 알 수 NULL
있습니다.
public function getValueTablePrefix()
{
if (!$this->_valueTablePrefix) {
$prefix = (string)$this->getEntityType()->getValueTablePrefix();
if (!empty($prefix)) {
$this->_valueTablePrefix = $prefix;
/**
* entity type prefix include DB table name prefix
*/
//Mage::getSingleton('core/resource')->getTableName($prefix);
} else {
$this->_valueTablePrefix = $this->getEntityTable();
}
}
return $this->_valueTablePrefix;
}
값 접두어가 정의되지 않은 경우 메소드의 논리는 다소 단순하며 엔티티 테이블 이름을 접두어로 사용하십시오.
나는이 테이블이 오랫동안 Magento에 있었기 때문에 완전히 제거하는 것보다 이전 버전과의 호환성을 유지하는 것이 가장 좋습니다. 내가 생각한 아이디어는 다른 개발자가 몇 가지 클래스를 확장하고 관리자를 통해 변경 될 수있는 이러한 "동적"속성을 가질 수있는 사용하기 쉬운 엔티티 / 모델 구조였습니다 (카탈로그 제품 및 고객 모델 참조). 불행하게도 상기 패턴의 구현 및 실행은 잘 확장되지 않고 문제를 야기한다. 필자는 문서와 예제 사용 사례가 없거나 성능이 좋지 않기 때문에이 구조를 야생에서 사용한 적이 없었습니다.
나는 핵심 개발자 (또는 고고학자)는 아니지만 코드 및 데이터 구조에서 수집 한 것이므로 약간의 빛을 발산하는 데 도움이되기를 바랍니다.