ฉันเดาว่ามันเป็นมรดกส่วนหนึ่งและรูปแบบ "ความสะดวกสบาย" สำหรับนักพัฒนาในการใช้เอนทิตี / โมเดล "ทั่วไป"
ตามที่คุณระบุไว้ตารางที่เกี่ยวข้องมักจะว่างเปล่า เหตุผลก็คือไม่มีเอนทิตี 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
และอื่น ๆ
สำรวจแหล่งที่มาสำหรับวิธีการเหล่านั้น ( ที่นี่และที่นี่ )
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 มาเป็นเวลานานจึงเป็นการดีที่สุดที่จะปล่อยให้ตารางเหล่านี้มีความเข้ากันได้แบบย้อนกลับได้ดีกว่าลบออกทันที แนวคิดที่ฉันเชื่อว่าพวกเขากำลังทำอยู่นั้นเป็นโครงสร้างเอนทิตี / โมเดลที่ใช้งานง่ายซึ่งนักพัฒนาอื่นสามารถขยายคลาสได้เพียงเล็กน้อยและมีแอตทริบิวต์ "ไดนามิก" เหล่านี้ที่สามารถเปลี่ยนแปลงได้ผ่านทางผู้ดูแลระบบ (ดูผลิตภัณฑ์แคตตาล็อกและโมเดลลูกค้า) น่าเสียดายที่การนำรูปแบบดังกล่าวไปใช้นั้นไม่ได้ผลดีนักและนำไปสู่ปัญหา ฉันไม่เคยเห็นโครงสร้างนี้ใช้ในไวลด์อาจเนื่องมาจากการขาดเอกสารประกอบและตัวอย่างการใช้เคสหรือประสิทธิภาพต่ำ
ฉันไม่ใช่นักพัฒนาหลัก (หรือนักโบราณคดี) แต่นั่นคือสิ่งที่ฉันรวบรวมจากรหัสและโครงสร้างข้อมูลหวังว่ามันจะช่วยให้มีแสงสว่าง