这其实是个老话题,什么叫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类型,因为都是根据主键取单条数据,表连接也不会给数据库有多少压力,都加到主表会让主表变的臃肿。这里面的度的掌握就看各自根据实际情况摸索了。