আমার অনুমান যে এটি বংশগত উত্তরাধিকার এবং বিকাশকারীদের "জেনেরিক" সত্তা / মডেলগুলি প্রয়োগ করার জন্য একটি "সুবিধা" প্যাটার্ন।
যেমনটি আপনি বলেছেন, সম্পর্কিত টেবিলগুলি সাধারণত খালি থাকে। কারণ হ'ল মূল 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পদ্ধতি খুঁজে পাই । এই পদ্ধতিটি সাধারণ সিআরইউডি অপারেশনের সময় কোয়েরি তৈরি করার সময় কোন টেবিলটি ব্যবহার করতে হবে তা নির্ধারণ করতে ব্যবহৃত হয়। আরেকটি পদ্ধতি যা আগ্রহী তা হ'ল getValueTablePrefix। এটি তথ্য "টাইপ" টেবিলের জন্য টেবিলের জন্য উপসর্গ নির্ধারণ করে, *_datetime, *_decimal,*_varchar ইত্যাদি।
সেই পদ্ধতি (জন্য উৎস মধ্যে peeking এখানে এবং এখানে )।
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;
}
পদ্ধতিতে যুক্তিটি বরং সহজ, যদি কোনও মান উপসর্গ সংজ্ঞায়িত না হয় তবে সত্তার টেবিলের নামটি উপসর্গ হিসাবে ব্যবহার করুন।
আমি অনুমান করি যেহেতু এই টেবিলগুলি এতদিন ধরে ম্যাজেন্টোতে রয়েছে সেগুলি সরাসরি সরানোর চেয়ে কোনও পিছনের সামঞ্জস্যের জন্য এগুলি রাখা ভাল best আমি বিশ্বাস করি যে তারা যাচ্ছিলেন তা হ'ল সত্তা / মডেল কাঠামোটি ব্যবহার করা সহজ ছিল যা অন্যান্য বিকাশকারীরা কেবল কয়েকটি শ্রেণি প্রসারিত করতে পারে এবং এই "গতিশীল" বৈশিষ্ট্যগুলি অ্যাডমিনের মাধ্যমে পরিবর্তিত হতে পারে (ক্যাটালগ পণ্য এবং গ্রাহক মডেলগুলি দেখুন)। দুর্ভাগ্যক্রমে উক্ত প্যাটার্নটির বাস্তবায়ন এবং অনুশীলনটি ভাল স্কেল বলে মনে হয় না এবং সমস্যার দিকে পরিচালিত করে। বুনোতে এই কাঠামোটি আমি কখনও দেখিনি, সম্ভবত ডকুমেন্টেশন এবং উদাহরণ ব্যবহারের ক্ষেত্রে বা দুর্বল পারফরম্যান্সের অভাবে।
আমি কোনও মূল বিকাশকারী (বা প্রত্নতাত্ত্বিক) কিন্তু আমি কোড এবং ডেটা কাঠামো থেকে সংগ্রহ করি না, আশা করি এটি কিছুটা আলোকপাত করতে সহায়তা করবে।