मेरा अनुमान है कि यह डेवलपर्स और "जेनेरिक" संस्थाओं / मॉडल को लागू करने के लिए डेवलपर्स के लिए एक विरासत और "सुविधा" पैटर्न है।
जैसा कि आपने कहा है, संबंधित सारणियां आमतौर पर खाली होती हैं। इसका कारण यह है कि कोर ईएवी संस्थाओं में से कोई भी इस "डिफ़ॉल्ट" इकाई तालिका संरचना का उपयोग नहीं करता है। ये एक 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
और इतने पर।
उन तरीकों के लिए स्रोत में झांकना ( यहां और यहां) )।
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 में इतने लंबे समय के लिए किया गया है यह किसी भी पिछड़े संगतता के लिए उन्हें बाहर निकालने की तुलना में उन्हें छोड़ने के लिए सबसे अच्छा है। यह विचार कि मेरा मानना है कि वे इकाई / मॉडल संरचना का उपयोग करने में आसान थे, अन्य डेवलपर्स कुछ वर्गों का विस्तार कर सकते हैं और इन "गतिशील" विशेषताओं को व्यवस्थापक के माध्यम से बदल सकते हैं (कैटलॉग उत्पादों और ग्राहक मॉडल देखें)। दुर्भाग्यवश, उक्त पैटर्न के क्रियान्वयन और अभ्यास को अच्छी तरह से नहीं लगता है और समस्याओं की ओर ले जाता है। मैंने इस संरचना को जंगली में कभी नहीं देखा है, शायद प्रलेखन की कमी और उदाहरण मामलों या खराब प्रदर्शन के कारण।
मैं कोई कोर डेवलपर (या पुरातत्वविद्) नहीं हूं, लेकिन यही मैं कोड और डेटा संरचनाओं से इकट्ठा करता हूं, उम्मीद है कि यह कुछ प्रकाश को बहाने में मदद करता है।