本来,作为一个PHP程序员,如果你想攒一组变量的相关你有一个选择,古老的 阵列 。 尽管共享一个地址的名称与C存储器的阵列,一个PHP数组是一种通用的字典可变数组索引像数值对象结合行为的影响。

在其他语言的选择不是那么简单。 您有 多个数据结构 语义学的选择,每组速度和提供特定的优势,存储。 PHP的理念是消除客户程序员这个选择,让他们从一个有用的数据结构,这是”足够好”。

所有这一切难堪的是一个特定类型的软件开发人员,和PHP 5着手改变通过提供内置的地位利国的类和接口,允许你创建自己的数据结构。

Magento充分利用了这一点,在使用Varien_Data_Collection来做数据收集的时候,它实现了php内置IteratorAggregate对象迭代器和Countable两个接口。

下面是用php内置类ArrayObject的一个例子。

$array = new ArrayObject();
class  MyCollection extends ArrayObject{}
$collection = new  MyCollection();
$collection[] = 'bar';

在接下来的文章中,我认为你已经了解ArrayObject、IteratorAggregate、Countable。如果还是很陌生,我建议你先阅读这篇文章PHP5对象迭代(Object Iteration)。当然你不必了解很底层的东西,你只需要知道如何用就可以了。

在Magento代码中,其实每个Model都有个Collection。了解这些数据收集器是如何工作的是你成为一个真正Magento开发人员的关键点。
下面让我们开始吧,前面我们创建过一个Helloworld模块,现在我们继续用他开始我们接下来的学习。

创建一个数据收集器
首先,我们创造一些新的对象。

$thing_1 = new Varien_Object();
$thing_1->setName(‘Richard’);
$thing_1->setAge(24);

$thing_2 = new Varien_Object();
$thing_2->setName(‘Jane’);
$thing_2->setAge(12);

$thing_3 = new Varien_Object();
$thing_3->setName(‘Spot’);
$thing_3->setLastName(‘The Dog’);
$thing_3->setAge(7);
Magento中所有的Model都继承Varien_Object,在面向对象编程中,这样做的好处是当你想往多个Model中添加方法的时候,你只需要简单地修改一个文件即可。

在继承Varien_Object的类中,有两个魔术方法,get/set,你可以很方便的向对象中加入一个属性(值),让我们看个例子。

var_dump($thing_1->getName());
如果你忘记了属性的名字,你可以将所有数据都获取到:

var_dump($thing_3->getData());
你将看到以下结果:

array
‘name’ => string ‘Spot’ (length=4)
‘last_name’ => string ‘The Dog’ (length=7)
‘age’ => int 7
注意last_name属性,是用下滑线分隔的,如果你想用get和set魔术方法,那么需要使用驼峰命名法。

$thing_1->setLastName(‘Smith’);
在新版本的magento中你可以用array关联数组的方式获取数据。

var_dump($thing_3[“last_name”]);
T这个归功于php5的新特性,ArrayAccess接口。也是 “Object Oriented Programming”.

现在然我们把这些对象加到数据收集器Varien_Data_Collection中。很多程序员将Collection看成是数组,当然我不反对。

$collection_of_things = new Varien_Data_Collection();
$collection_of_things
->addItem($thing_1)
->addItem($thing_2)
->addItem($thing_3);
大多数Magento data Collections继承于Varien_Data_Collection,你可以使用里面的任何一个方法。

那么我们可以做些什么呢?接下来我们使用foreach去循环它。

foreach($collection_of_things as $thing)
{
var_dump($thing->getData());
}
这里还有方法取出第一个数据和最后一个数据。

var_dump($collection_of_things->getFirstItem());
var_dump($collection_of_things->getLastItem()->getData());
将你的数据转成xml

var_dump( $collection_of_things->toXml() );
只像取某一个字段

var_dump($collection_of_things->getColumnValues(‘name’));
Magneto还给我们提供了一些基本的过滤功能

var_dump($collection_of_things->getItemsByColumnValue(‘name’,’Spot’));
模型数据收集器(Model Collections)
前面我们有提到,所有Magento的模型数据收集器都继承Varien_Data_Collectionm,所以理论上我们可以使用之前的所有方法。下面让我们以product模型实战下。

public function testAction()
{
$collection_of_products = Mage::getModel(‘catalog/product’)->getCollection();
var_dump($collection_of_products->getFirstItem()->getData());
}
基本所有的Magento模型都有个方法叫getCollection默认情况下,它会返回系统中所有的数据。

Magento的数据收集器Collection包含很多复杂的逻辑来处理数据,无论是否使用索引或缓存、EAV表等。

上面的产品数据收集器,它里面还有Varien_Data_Collection_Db类。这个类给你很多有用的方法,例如如果你向看sql的select语句。

public function testAction()
{
$collection_of_products = Mage::getModel(‘catalog/product’)->getCollection();
var_dump($collection_of_products->getSelect()); //might cause a segmentation fault
}
上面的方法将输出

object(Varien_Db_Select)[94]
protected ‘_bind’ =>
array
empty
protected ‘_adapter’ =>

从上面可以看出,Magento使用的是ZendFramework的数据库链接层。接下来让我们看看更有意义的东西

public function testAction()
{
$collection_of_products = Mage::getModel(‘catalog/product’)->getCollection();
//var_dump($collection_of_products->getSelect()); //might cause a segmentation fault
var_dump(
(string) $collection_of_products->getSelect()
);
}
上面的方法将输出

‘SELECT `e`.* FROM `catalog_product_entity` AS `e`’
有时也会比较复杂,例如

string ‘SELECT `e`.*, `price_index`.`price`, `price_index`.`final_price`, IF(`price_index`.`tier_price`, LEAST(`price_index`.`min_price`, `price_index`.`tier_price`), `price_index`.`min_price`) AS `minimal_price`, `price_index`.`min_price`, `price_index`.`max_price`, `price_index`.`tier_price` FROM `catalog_product_entity` AS `e`
INNER JOIN `catalog_product_index_price` AS `price_index` ON price_index.entity_id = e.entity_id AND price_index.website_id = ‘1’ AND price_index.customer_group_id = 0′
这个差异取决于你选择的字段,同样也涉及到索引和缓存。如果你看过之前的文章,那么你应该知道很多Magento表是使用Eav表结构的,默认情况下一个eav的数据收集器将不会包含所有的对象字段,你可以通过addAttributeToSelect来添加它们。让我们看看例子。

$collection_of_products = Mage::getModel(‘catalog/product’)
->getCollection()
->addAttributeToSelect(‘*’); //the asterisk is like a SQL SELECT *
或者你也可以只选某一个字段

//or just one
$collection_of_products = Mage::getModel(‘catalog/product’)
->getCollection()
->addAttributeToSelect(‘meta_title’);
或者更多

//or just one
$collection_of_products = Mage::getModel(‘catalog/product’)
->getCollection()
->addAttributeToSelect(‘meta_title’)
->addAttributeToSelect(‘price’);
延迟加载(Lazy Loading)
一般情况下,我们在创建sql后需要立刻执行,从而获取数据,例如。

$model = new Customer();
//SQL Calls being made to Populate the Object
echo ‘Done’; //execution continues
但是Magento不是这样的,它采用的是Lazy Loading。延迟加载意味着在程序需要数据前,sql是不执行的,如下。

$collection_of_products = Mage::getModel(‘catalog/product’)
->getCollection();
在这个时候Magento还没有链接数据库,你可以放心地去做你想要做的事。

$collection_of_products = Mage::getModel(‘catalog/product’)
->getCollection();
$collection_of_products->addAttributeToSelect(‘meta_title’);
你不必担心每次添加属性的时候Magento都会执行一个sql,去获取数据,sql只有在你需要数据的时候才会被执行。

Magento对数据库连接层做了良好的封装,当然它也考虑到了效率问题。在一般情况下,你没必要去担心sql后台是怎么执行的,只需要专心做你的功能,例如区块、布局等。这是Magento非常优秀的地方。

过滤数据(Filtering Database Collections)
最重要的一个方法是addFieldToFilter。通过这个方法可以添加我们sql中的WHERE语句。

public function testAction()
{
$collection_of_products = Mage::getModel(‘catalog/product’)
->getCollection();
$collection_of_products->addFieldToFilter(‘sku’,’n2610′);

//another neat thing about collections is you can pass them into the count //function. More PHP5 powered goodness
echo “Our collection now has ” . count($collection_of_products) . ‘ item(s)’;
var_dump($collection_of_products->getFirstItem()->getData());
}
addFieldToFilter方法中的第一个参数是你想过滤的字段名称,第二个是你想过滤的值。例如刚刚sku是字段名称,n2610是值。

第二个参数也可以被用来指定某一类型的数据。稍微有些复杂,我们继续往下看。

$collection_of_products->addFieldToFilter(‘sku’,’n2610′);
这个等同于sql中的where条件句

WHERE sku = “n2610”
下面的例子自己尝试下

public function testAction()
{
var_dump(
(string)
Mage::getModel(‘catalog/product’)
->getCollection()
->addFieldToFilter(‘sku’,’n2610′)
->getSelect());
}
将会输出这个

SELECT `e`.* FROM `catalog_product_entity` AS `e` WHERE (e.sku = ‘n2610′)’
但是这个很快会变得很复杂。试着做下面的练习。

var_dump(
(string)
Mage::getModel(‘catalog/product’)
->getCollection()
->addAttributeToSelect(‘*’)
->addFieldToFilter(‘meta_title’,’my title’)
->getSelect()
);
输出的将是下面的sql语句。

SELECT `e`.*, IF(_table_meta_title.value_id>0, _table_meta_title.value, _table_meta_title_default.value) AS `meta_title`
FROM `catalog_product_entity` AS `e`
INNER JOIN `catalog_product_entity_varchar` AS `_table_meta_title_default`
ON (_table_meta_title_default.entity_id = e.entity_id) AND (_table_meta_title_default.attribute_id=’103′)
AND _table_meta_title_default.store_id=0
LEFT JOIN `catalog_product_entity_varchar` AS `_table_meta_title`
ON (_table_meta_title.entity_id = e.entity_id) AND (_table_meta_title.attribute_id=’103′)
AND (_table_meta_title.store_id=’1′)
WHERE (IF(_table_meta_title.value_id>0, _table_meta_title.value, _table_meta_title_default.value) = ‘my title’)
在你有空的时候可以好好研究下上面的sql语句,我们先不转移焦点,继续我们下面的讲解。

其它比较运算符
我确定在刚刚的练习中,你想知道如何实现一个不是”=”的where条件句,例如不等于、大于、小于。刚刚我们有讲过addFieldToFilter的第二个参数允许传入不同”类型”。
其实很简单,只要将一个简单的数组作为第二个参数传入addFieldToFilter方法就可以变换条件句。

数组的键就是”类型”,关联的值就是你想过滤的值。我们改写下上面的代码。

public function testAction()
{
var_dump(
(string)
Mage::getModel(‘catalog/product’)
->getCollection()
->addFieldToFilter(‘sku’,array(‘eq’=>’n2610’))
->getSelect()
);
}
看上面的过滤器

addFieldToFilter(‘sku’,array(‘eq’=>’n2610′))
正如你看到的,第二个参数是一个php的数组。它的键是”eq”,代表等于的意思。

Magento在这个函数中有一系列英语的缩写,这些词的资料可以参考《tear of remembrance》。这些沿用了Perl语言中的一些比较运算符号。

在这里我将Magento所有的条件判断符号列出来供大家参考。

array(“eq”=>’n2610’)
WHERE (e.sku = ‘n2610′)

array(“neq”=>’n2610’)
WHERE (e.sku != ‘n2610′)

array(“like”=>’n2610’)
WHERE (e.sku like ‘n2610′)

array(“nlike”=>’n2610’)
WHERE (e.sku not like ‘n2610′)

array(“is”=>’n2610’)
WHERE (e.sku is ‘n2610’)

array(“in”=>array(‘n2610’))
WHERE (e.sku in (‘n2610’))

array(“nin”=>array(‘n2610’))
WHERE (e.sku not in (‘n2610′))

array(“notnull”=>’n2610′)
WHERE (e.sku is NOT NULL)

array(“null”=>’n2610′)
WHERE (e.sku is NULL)

array(“gt”=>’n2610’)
WHERE (e.sku > ‘n2610′)

array(“lt”=>’n2610’)
WHERE (e.sku < ‘n2610′)

array(“gteq”=>’n2610’)
WHERE (e.sku >= ‘n2610′)

array(“moreq”=>’n2610’) //a weird, second way to do greater than equal
WHERE (e.sku >= ‘n2610′)

array(“lteq”=>’n2610’)
WHERE (e.sku <= ‘n2610’)

array(“finset”=>array(‘n2610’))
WHERE (find_in_set(‘n2610’,e.sku))

array(‘from’=>’10’,’to’=>’20’)
WHERE e.sku >= ’10’ and e.sku <= ’20’
其中大多数是自我的理解,但有几个得特别注意。

in, nin, find_in_set
in and nin 条件句中,语序你传入一个数组作为值。例如:

array(“in”=>array(‘n2610′,’ABC123’)
WHERE (e.sku in (‘n2610′,’ABC123′))
notnull, null
关键字NULL是最特殊的sql句,它将忽略你传入的值。

array(“notnull”=>’n2610’)
WHERE (e.sku is NOT NULL)
from – to 过滤
这是另一种过滤方式,在传入的数组中,允许你传入两个键,是从哪里到哪里的意思,一个数值区间。

public function testAction
{
var_dump(
(string)
Mage::getModel(‘catalog/product’)
->getCollection()
->addFieldToFilter(‘price’,array(‘from’=>’10’,’to’=>’20’))
->getSelect()
);
}
上面等同于

WHERE (_table_price.value >= ’10’ AND _table_price.value <= ’20’)
AND 或者 OR
根据刚才讲的内容,你可以知道,通过多个 addFieldToFilter方法可以获得一个”AND”的条件句。

function testAction()
{
echo(
(string)
Mage::getModel(‘catalog/product’)
->getCollection()
->addFieldToFilter(‘sku’,array(‘like’=>’a%’))
->addFieldToFilter(‘sku’,array(‘like’=>’b%’))
->getSelect()
);
}
等同于下面的子句

WHERE (e.sku LIKE ‘a%’) AND (e.sku LIKE ‘b%’)
但是,聪明的你可以发现,上面的例子不可能返回任何结果,因为一个sku不可能以a开头,同时也以b开头。
我们希望用的应该是”OR”,那么如何实现呢?这又使我们将焦点集中到了addFieldToFilter方法的第二个参数上。

如果你希望构造一个or的语句,首先我们构造两个参数。

public function testAction()
{
$filter_a = array(‘like’=>’a%’);
$filter_b = array(‘like’=>’b%’);
}
然后将它们作为一组参数传入addFieldToFilter方法中,如下。

public function testAction()
{
$filter_a = array(‘like’=>’a%’);
$filter_b = array(‘like’=>’b%’);
echo(
(string)
Mage::getModel(‘catalog/product’)
->getCollection()
->addFieldToFilter(‘sku’,array($filter_a,$filter_b))
->getSelect()
);
}
你可以看到这样的一个子句。

WHERE (((e.sku LIKE ‘a%’) OR (e.sku LIKE ‘b%’)))

总结

恭喜你,你现在已经是一个很不错的Magento开发者了!因为你不需要写任何sql语句,就可以获取几乎所有模型的所有你想要的数据。

转载于:https://www.cnblogs.com/ec04/p/6307091.html

深入理解MAGENTO – 第九章 – 数据集合瓦瑞恩相关推荐

  1. 深入理解计算机系统——第九章 Virtual Memory

    深入理解计算机系统--第九章 Virtual Memory 9.1 Physical and Virtual Addressing 9.2 Address Spaces 9.3 VM as a Too ...

  2. 深入理解计算机系统--第九章虚拟存储器

    9.虚拟存储器 为了更加有效地管理存储器且少出错,现代系统提供了对主存的抽象概念,叫做虚拟存储器(VM). 虚拟存储器是硬件异常,硬件地址翻译,主存,磁盘文件和内核软件的完美交互. 为每个进程提供一个 ...

  3. 深入理解Magento – 第二章 – Magento请求分发与控制器

    深入理解Magento 作者:Alan Storm 翻译:Hailong Zhang 第二章 – Magento请求分发与控制器 Model-View-Controller (MVC) ,模型-视图- ...

  4. 深入理解Magento – 第一章 – Magento强大的配置系统

    深入理解Magento 作者:Alan Storm 翻译:Hailong Zhang 第一章 – Magento强大的配置系统 Magento的配置系统就像是Magento的心脏,支撑着Magento ...

  5. Java核心技术卷一 -第九章:集合

    系列文章目录 Java核心技术卷一 -第一章:java"白皮书"的关键术语 Java核心技术卷一 -第三章:数据类型 Java核心技术卷一 -第三章:变量与常量 Java核心技术卷 ...

  6. 《利用python进行数据分析》读书笔记--第九章 数据聚合与分组运算(一)

    http://www.cnblogs.com/batteryhp/p/5046450.html 对数据进行分组并对各组应用一个函数,是数据分析的重要环节.数据准备好之后,通常的任务就是计算分组统计或生 ...

  7. linux动态分配全局置换,深入理解计算机系统 第九章 虚拟存储器

    虚拟存储器 定义: 对主存的抽象机制,是硬件异常.硬件地址翻译.主存.磁盘文件和内核软件的完美交互. 功能: 1. 将主存看成是一个存储在磁盘上的地址空间的高速缓存,在内存中只保存活动区域,并根据需要 ...

  8. 《数学之美》——第九章 个人笔记

    数学之美 最近在读<数学之美>这本书,做一下个人笔记.看的是PDF,看完后会买一本的哦!版权意识还是有的. ps:图片文字都是这本书中的内容,侵权立删.会有点自己的理解. 第九章    图 ...

  9. 深入理解Magento – 第六章 – 高级Magento模型

    深入理解Magento 作者:Alan Storm 翻译:Hailong Zhang 第六章 – 高级Magento模型 我们讲过Magento有两种模型,简单模型和EAV(Entity Attrib ...

最新文章

  1. hadoop集群环境搭建准备工作
  2. 关于python的一些好的书籍推荐-荐书||关于Python的一些书籍推荐
  3. reactNative 计算时间差
  4. ip打包相对路径 vivado_Vivado自定义IP封装流程
  5. java数组复制用for_在JavaScript中复制数组的最快方法 - 切片与'for'循环
  6. python搭建邮件服务器地址_python 配置邮件发送服务器发送邮件
  7. plsql打开sql窗口快捷键_可以提升3倍开发效率的 Intellij IDEA快捷键大全汇总(2019)...
  8. 推荐一个插件: The Great Suspender,大大减少chrome浏览器内存占用量
  9. 移动支付的方式有哪些拾方易告诉你
  10. 计算机论文目录大全,毕业论文目录范文
  11. F检验(ANOVA)
  12. 中证500指数的跟踪基金最近1年收益排名
  13. HashSet源码解读
  14. JS 案例 个人所得税计算器
  15. 举办计算机知识竞赛的意义,计算机专业成功举办“计算机基础知识竞赛”
  16. python出现syntaxerror_Python SyntaxError语法错误原因及解决
  17. 大学计算机考试不挂科秘诀,在大学,考试想不挂科,学渣的4个锦囊妙计,最后一点看笑了!...
  18. grep搜索特定文件
  19. 2021深育杯MISC超详细WP
  20. 精尽Spring MVC源码分析 - 一个请求的旅行过程

热门文章

  1. 【004 关键字】extern “C“的作用是什么?
  2. 2022第一位华为“天才少年”!绩点1.8逆袭!
  3. gulp构建项目(三):gulp-watch监听文件改变、新增、删除
  4. [转] 疯狂猎鸟项目小结
  5. spyder python3.6_如何在Spyder(Python3.6)中安装SCIP
  6. HTML+CSS+JavaScript知识点总结
  7. sw中的转换实体引用工具的使用
  8. 快速搭建DMHS DM之间双向同步
  9. [转载] 如何规划好自己的读博生涯
  10. win10系统怎么启用策略服务器,Windows 10系统启动项安全引导策略