Magento--給EAV模型新增非EAV屬性

這其實是個老話題,什麼叫EAV模型的非EAV屬性,以用戶爲例,添加EAV屬性對用戶主表(customer_entity)的結構沒有改變,而所謂的非EAV屬性,是指直接給customer_entity表新增物理字段。需要注意的是,在Magento的架構裏,EAV類型對象(用戶),直接給主表新加的字段是沒辦法通過常規的對象操作進行讀寫的,不過不用擔心,Magento其實考慮到了這種需求,怎麼處理請看下面的示例代碼:


$installer = $this;
$installer->startSetup();

$installer->run("
ALTER TABLE `{$installer->getTable('customer/entity')}` ADD `mobile` VARCHAR(255) NULL DEFAULT NULL AFTER `email`;
");

$mobile = 'mobile';

$installer->addAttribute('customer', $mobile, array(
    'type'      => 'static',
    'label'     => 'Mobile',
    'input'     => 'text',
    'backend'   => '',
    'position'  => 80,
    'required'  => false
));

$mobileAttribute = Mage::getSingleton('eav/config')
->getAttribute('customer', $mobile);
$mobileAttribute->setData('used_in_forms',
    array('customer_account_edit','customer_account_create','adminhtml_customer','checkout_register')
);
$mobileAttribute->save();

給用戶新增手機號屬性爲例,以上代碼跟新增一個EAV屬性的區別在於,一,mobile是直接加在主表的新字段(第一段代碼),二,mobile屬性的type是static,這裏的static就是註明了這個mobile屬性是一個靜態屬性(主表的一個字段)(第二段代碼)。第三段代碼是用戶實體獨有的,從代碼字面意思就很好理解,標記這個新屬性可用在哪些表單('customer_account_edit','customer_account_create','adminhtml_customer','checkout_register')。

回過頭來說,什麼情況下適合加靜態屬性而不是加EAV屬性呢,我個人理解是,還是以手機號字段爲例,現在很多國內的網站都同時支持“用戶名/郵箱/手機號”任選一登錄,那麼手機號字段就會需要有唯一性,並且會在一些業務流程中作爲篩選用戶的過濾條件,這種情況下,傳統的eav字段會使數據庫進行大量的表連接操作,給數據庫帶來不小的壓力。當然反過來說,有些新增的屬性就適合eav類型,比如某個屬性只會用來做顯示,那麼即便是eav類型,因爲都是根據主鍵取單條數據,表連接也不會給數據庫有多少壓力,都加到主表會讓主表變的臃腫。這裏面的度的掌握就看各自根據實際情況摸索了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章