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

相关文章
UE4/5中DataTable数据表的使用
UE4/5中DataTable数据表的使用
1170 1
UE4/5中DataTable数据表的使用
架构师“三部曲”——阿里云 MVP 沈剑
沈剑,公众号“架构师之路”的作者,曾任百度高级工程师和58同城高级架构师、技术委员会主席、技术学院优秀讲师,现为到家集团技术委员会主席和技术VP,同时也是快狗打车(原58速运)的CTO。本文是沈剑老师在阿里云的直播中分享的一些自己关于架构师的看法和成为架构师的心路历程的第二部分。
3756 0
架构师“三部曲”——阿里云 MVP 沈剑
我的架构师之路——阿里云 MVP 沈剑
沈剑,公众号“架构师之路”的作者,曾任百度高级工程师和58同城高级架构师、技术委员会主席、技术学院优秀讲师,现为到家集团技术委员会主席和技术VP,同时也是快狗打车(原58速运)的CTO。本文是沈剑老师在阿里云的直播中分享的一些自己关于架构师的看法和成为架构师的心路历程的第一部分。
6542 0
我的架构师之路——阿里云 MVP 沈剑
机器学习-特征选择:如何使用递归特征消除算法自动筛选出最优特征?
机器学习-特征选择:如何使用递归特征消除算法自动筛选出最优特征?
1431 0
|
9月前
|
如何理解结构体的浅拷贝与深拷贝
结构体的浅拷贝仅复制对象的引用或基本数据类型值,不创建新对象;深拷贝则会递归地复制所有对象及其引用的对象,形成完全独立的新对象。两者主要区别在于是否共享内部对象。
在 MySQL 中使用 `REPLACE` 函数
【8月更文挑战第8天】
1290 7
在 MySQL 中使用 `REPLACE` 函数
国产化中间件正在侵蚀开源中间件
国产化中间件正在侵蚀开源中间件
1349 6
linux 查看nginx状态和php-fpm状态 nginx-status和php-status
linux 查看nginx状态和php-fpm状态 nginx-status和php-status
152 0
|
11月前
|
Docker启动的容器如何做到自动重启?
【8月更文挑战第19天】Docker启动的容器如何做到自动重启?
1187 1
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问