Domyślam się, że jest to częściowo dziedzictwo i wzorzec „wygody” dla programistów do wdrażania „ogólnych” bytów / modeli.
Jak już wspomniałeś, powiązane tabele są zwykle puste. Powodem jest to, że żadna z podstawowych jednostek EAV nie używa tej „domyślnej” struktury tabeli jednostek. Oto tabele encji z instalacji 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)
Na przykładzie modelu klienta możemy zobaczyć, że model zasobów Mage_Customer_Model_Resource_Customer
rozszerza się Mage_Eav_Model_Entity_Abstract
, Źródło .
Uwaga : Przed wersją 1.6 Mage_Customer_Model_Entity_Customer
rozszerzono także model zasobów dla jednostki klienta Mage_Eav_Model_Entity_Abstract
, Źródło .
Jeśli zbadamy Mage_Eav_Model_Entity_Abstract
klasę, znajdziemy getEntityTable
metodę. Ta metoda służy do określania, której tabeli należy użyć podczas budowania zapytań podczas typowych operacji CRUD. Inną interesującą metodą jest getValueTablePrefix
. To określa prefiks tabel dla tabel danych „typ”, *_datetime
, *_decimal
, *_varchar
i tak dalej.
Zaglądając do źródła tych metod ( tu i tutaj ).
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;
}
W powyższej metodzie możemy zobaczyć, że jeśli typ encji nie definiuje niestandardowej tabeli, domyślnie jest to ustawiane Mage_Eav_Model_Entity::DEFAULT_ENTITY_TABLE
. Wartością tej stałej jest 'eav/entity'
, która z kolei zamienia się w eav_entity
tabelę (zakładając, że w aplikacji nie ma skonfigurowanego prefiksu tabeli). Druga metoda, o której wspomniałem, opiera się na tej tabeli jako prefiks, jeśli żadna nie została skonfigurowana dla danej jednostki. Jeśli sprawdzisz wartości w eav_entity_type
tabeli dla value_table_prefix
kolumny, zauważysz, że wszystkie one są 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;
}
Logika w metodzie jest raczej prosta, jeśli nie zdefiniowano prefiksu wartości, użyj nazwy tablicy encji jako prefiksu.
Zakładam, że skoro te tabele są w Magento od tak dawna, najlepiej pozostawić je dla kompatybilności wstecznej, niż je całkowicie usunąć. Pomysł, który według mnie zamierzali, był łatwą w użyciu strukturą encji / modelu, którą inni programiści mogliby po prostu rozszerzyć o kilka klas i mieć te „dynamiczne” atrybuty, które można zmienić za pośrednictwem administratora (patrz produkty z katalogu i modele klientów). Niestety implementacja i praktyka tego wzorca nie wydaje się dobrze skalować i prowadzi do problemów. Nigdy nie widziałem tej struktury używanej na wolności, prawdopodobnie z powodu braku dokumentacji i przykładowych przypadków użycia lub słabej wydajności.
Nie jestem głównym programistą (ani archeologiem), ale to, co zbieram ze kodu i struktur danych, mam nadzieję, że to pomoże rzucić nieco światła.