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

时间: 2024-08-01 16:15:53

Magento--给EAV模型新增非EAV属性的相关文章

途牛研发团队:基于EAV模型搭建准自动化运营系统架构

本文将介绍如何基于 EAV 模型,来构造一个准自动化的运营系统,服务运营研发部的相关工作.     我们的痛点  运营研发部对接三端(PC.M.APP)后台工作,劳心劳力.   头疼的稀疏表( 稀疏表通常会有很多列,但是每一行有值的列又比较少.)+头疼的各种表. 持续的迭(xu)代(qiu)升(bian)级(geng)(每一次功能升级,都需要变更表结构). 基础数据的维护代码坑好多,打个标签加个属性,都好怕. Code Monkey,熟悉的表+熟悉的套路(设计表单.设计字段.CRUD-)Boom

C# 静态属性能否读写非静态字段?非静态属性能否读写静态字段?

问题描述 ①静态属性只能读写静态字段吗?能否读写非静态字段?②非静态属性能否读写静态字段?③静态字段可以通过静态属性赋值吗? 解决方案 本帖最后由 syncsdn9 于 2016-03-23 13:44:12 编辑解决方案二:①静态属性能读写非静态字段,前提是能获取到对象②非静态属性当然能读写静态字段③静态字段当然可以通过静态属性赋值解决方案三:都可以的,静态属性调用非静态时需要对像的引用.

新增非空约束字段在不同版本中的演进

开发提了一个数据库变更需求,新增一字段,没有NOT NULL非空约束,但有默认值为NULL.看起来有些奇怪,因为若字段允许NULL,其默认值就是NULL,不用显示声明,可以创建一个无DEFAULT NULL的新增字段再查看desc表结构,就可以证明这点. 基于这问题,引申出的NOT NULL字段问题还有不少,也是比较容易忽视的一些细节,例如杨长老最近连续发表过两篇关于NOT NULL字段的文章确实很有启发, 非空字段空值对查询的影响 http://yangtingkun.net/?p=1481

HTML5的表单新增了哪些属性?

1. 表单内元素的form属性 在H5中可以把form放到页面的任何地方,然后为该元素指定一个form属性,属性值为该表单的id,这样就可以声明该元素从属于指定表单了 <formid="testform">      <inputtype="text">     </form>     <textareaform="testform"></textarea> 2. 表单内元素的forma

从需求出发来看关系模型与非关系模型--时代的变革1

上次我们谈到,因为互联网应用的实际需求与传统数据库之间出现了不匹配的情况.   于是,破坏与重构就成为了新时代的主音.   对互联网应用而言,最急需的需求,就是处理大量用户输入的海量数据,进行一些逻辑处理后再将结果返回给用户.因此,对于在线数据处理来说,可水平扩展的容量指标,可无限增长的写入tps和读取qps,是互联网企业的最大,最急需的需求.   相比较而言,为了追求性能和容量的尽可能最大化,其他的指标则被迫的推到了后面.这也非常容易理解,性能不够,容量不够,直接面临的是不能提供服务,作为互联

HTML5 新增元素与属性用法介绍

在创建Web应用程序的时候,免不了会用到大量的表单元素.在HTML 5标准中, 吸纳 了Web Forms 2.0的标准,大幅度强化了针对表单元素的功能,使得关于表单的开发更快.更方便.   4.1 .1 新增属性 首先, 让我们看一下HTML 5中关于表单新增了哪些诱人的属性,以及现在有哪些浏览 器支持了这些属性. 1.form属性 在HTML 4中,表单内的从属元素必须书写在表单内部,但是在HTML 5 中,可以把它 们书写在页面上任何地方,然后给该元素指定一个form属性,属性值为该表单的

从需求出发来看关系模型与非关系模型--关系模型与非关系模型概述

自从NoSQL概念横空出世,关系数据库似乎就成了众矢之的,似乎一夜之间,关系数据库和SQL就成了低效,高成本,速度慢的数据处理模式的代名词. 在很多地方都能看到类似:"我的项目初创,应该选择什么NoSQL产品才能快速的开发?" 这样的问题.    正因有人提出这样的问题,才坚定了我把这篇文章放在了第一章的决心.主要的目标是希望借助这样一个形式,让大家能够比较清晰的认识到类似NoSQL,SchemaFree,RDBMS,CAP,BASE等等概念的本源,并了解到他们面对的主要场景,从而避免

HTML5新增标签和属性简介

HTML5以进入实际应用,它的强大之处早有耳闻,下面来看一下html5中的新标签和属性. HTML5中的新标签: <article>  :定义article <aside>:定义页面内容之外的内容 <audio>:定义声音内容 <canvas>:定义图形 <command>:定义命令按钮 <datalist>:定义列表 <datails>:定义元素的细节 <embed>:定义外部交互内容或插件 <figc

magento 开发 -- 深入理解Magento第六章 – 高级Magento模型

  第六章 – 高级Magento模型 我们讲过Magento有两种模型,简单模型和EAV(Entity Attribute Value)模型.上一章我们讲过所有的Magento模型都是继承自Mage_Core_Model_Abstract / Varien_Object.简单模型和EAV模型的区别在于资源模型(Model Resource).虽然所有的资源模型都最终继承"Mage_Core_Model_Resrouce_Abstract",但是简单模型是直接继承"Mage_