第九章数据操作数据收集器Word文档下载推荐.docx
《第九章数据操作数据收集器Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《第九章数据操作数据收集器Word文档下载推荐.docx(14页珍藏版)》请在冰点文库上搜索。
首先,我们创造一些新的对象。
$thing_1=newVarien_Object();
$thing_1->
setName('
Richard'
);
setAge(24);
$thing_2=newVarien_Object();
$thing_2->
Jane'
setAge(12);
$thing_3=newVarien_Object();
$thing_3->
Spot'
setLastName('
TheDog'
setAge(7);
Magento中所有的Model都继承Varien_Object,在面向对象编程中,这样做的好处是当你想往多个Model中添加方法的时候,你只需要简单地修改一个文件即可。
在继承Varien_Object的类中,有两个魔术方法,get/set,你可以很方便的向对象中加入一个属性(值),让我们看个例子。
var_dump($thing_1->
getName());
如果你忘记了属性的名字,你可以将所有数据都获取到:
var_dump($thing_3->
getData());
你将看到以下结果:
array
'
name'
=>
string'
(length=4)
last_name'
(length=7)
age'
int7
注意last_name属性,是用下滑线分隔的,如果你想用get和set魔术方法,那么需要使用驼峰命名法。
Smith'
在新版本的magento中你可以用array关联数组的方式获取数据。
var_dump($thing_3["
last_name"
T这个归功于php5的新特性,ArrayAccess接口。
也是“ObjectOrientedProgramming”.
现在然我们把这些对象加到数据收集器Varien_Data_Collection中。
很多程序员将Collection看成是数组,当然我不反对。
$collection_of_things=newVarien_Data_Collection();
$collection_of_things
->
addItem($thing_1)
addItem($thing_2)
addItem($thing_3);
大多数MagentodataCollections继承于Varien_Data_Collection,你可以使用里面的任何一个方法。
那么我们可以做些什么呢?
接下来我们使用foreach去循环它。
foreach($collection_of_thingsas$thing)
{
var_dump($thing->
}
这里还有方法取出第一个数据和最后一个数据。
var_dump($collection_of_things->
getFirstItem());
getLastItem()->
将你的数据转成xml
var_dump($collection_of_things->
toXml());
只像取某一个字段
getColumnValues('
));
Magneto还给我们提供了一些基本的过滤功能
getItemsByColumnValue('
'
模型数据收集器(ModelCollections)前面我们有提到,所有Magento的模型数据收集器都继承Varien_Data_Collectionm,所以理论上我们可以使用之前的所有方法。
下面让我们以product模型实战下。
publicfunctiontestAction()
$collection_of_products=Mage:
:
getModel('
catalog/product'
)->
getCollection();
var_dump($collection_of_products->
getFirstItem()->
基本所有的Magento模型都有个方法叫getCollection默认情况下,它会返回系统中所有的数据。
Magento的数据收集器Collection包含很多复杂的逻辑来处理数据,无论是否使用索引或缓存、EAV表等。
上面的产品数据收集器,它里面还有Varien_Data_Collection_Db类。
这个类给你很多有用的方法,例如如果你向看sql的select语句。
getSelect());
//mightcauseasegmentationfault
上面的方法将输出
object(Varien_Db_Select)[94
protected'
_bind'
array
empty
_adapter'
...
从上面可以看出,Magento使用的是ZendFramework的数据库链接层。
接下来让我们看看更有意义的东西
//var_dump($collection_of_products->
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`
INNERJOIN`catalog_product_index_price`AS`price_index`ONprice_index.entity_id=e.entity_idANDprice_index.website_id='
1'
ANDprice_index.customer_group_id=0'
这个差异取决于你选择的字段,同样也涉及到索引和缓存。
如果你看过之前的文章,那么你应该知道很多Magento表是使用Eav表结构的,默认情况下一个eav的数据收集器将不会包含所有的对象字段,你可以通过addAttributeToSelect来添加它们。
让我们看看例子。
$collection_of_products=Mage:
)
getCollection()
addAttributeToSelect('
*'
//theasteriskislikeaSQLSELECT*
或者你也可以只选某一个字段
//orjustone
meta_title'
或者更多
price'
延迟加载(LazyLoading)
一般情况下,我们在创建sql后需要立刻执行,从而获取数据,例如。
$model=newCustomer();
//SQLCallsbeingmadetoPopulatetheObject
echo'
Done'
//executioncontinues
但是Magento不是这样的,它采用的是LazyLoading。
延迟加载意味着在程序需要数据前,sql是不执行的,如下。
在这个时候Magento还没有链接数据库,你可以放心地去做你想要做的事。
$collection_of_products->
你不必担心每次添加属性的时候Magento都会执行一个sql,去获取数据,sql只有在你需要数据的时候才会被执行。
Magento对数据库连接层做了良好的封装,当然它也考虑到了效率问题。
在一般情况下,你没必要去担心sql后台是怎么执行的,只需要专心做你的功能,例如区块、布局等。
这是Magento非常优秀的地方。
过滤数据(FilteringDatabaseCollections)最重要的一个方法是addFieldToFilter。
通过这个方法可以添加我们sql中的WHERE语句。
->
$collection_of_products->
addFieldToFilter('
sku'
n2610'
//anotherneatthingaboutcollectionsisyoucanpassthemintothecount//function.MorePHP5poweredgoodness
echo"
Ourcollectionnowhas"
.count($collection_of_products).'
item(s)'
addFieldToFilter方法中的第一个参数是你想过滤的字段名称,第二个是你想过滤的值。
例如刚刚sku是字段名称,n2610是值。
第二个参数也可以被用来指定某一类型的数据。
稍微有些复杂,我们继续往下看。
这个等同于sql中的where条件句
WHEREsku="
n2610"
下面的例子自己尝试下
(string)
Mage:
将会输出这个
SELECT`e`.*FROM`catalog_product_entity`AS`e`WHERE(e.sku='
)'
但是这个很快会变得很复杂。
试着做下面的练习。
var_dump(
(string)
Mage:
mytitle'
输出的将是下面的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`
INNERJOIN`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
LEFTJOIN`catalog_product_entity_varchar`AS`_table_meta_title`
ON(_table_meta_title.entity_id=e.entity_id)AND(_table_meta_title.attribute_id='
AND(_table_meta_title.store_id='
WHERE(IF(_table_meta_title.value_id>
0,_table_meta_title.value,_table_meta_title_default.value)='
在你有空的时候可以好好研究下上面的sql语句,我们先不转移焦点,继续我们下面的讲解。
其它比较运算符我确定在刚刚的练习中,你想知道如何实现一个不是“=”的where条件句,例如不等于、大于、小于。
刚刚我们有讲过addFieldToFilter的第二个参数允许传入不同“类型”。
其实很简单,只要将一个简单的数组作为第二个参数传入addFieldToFilter方法就可以变换条件句。
数组的键就是“类型”,关联的值就是你想过滤的值。
我们改写下上面的代码。
array('
eq'
=>
))
看上面的过滤器
正如你看到的,第二个参数是一个php的数组。
它的键是“eq”,代表等于的意思。
Magento在这个函数中有一系列英语的缩写,这些词的资料可以参考《tearofremembrance》。
这些沿用了Perl语言中的一些比较运算符号。
在这里我将Magento所有的条件判断符号列出来供大家参考。
array("
eq"
WHERE(e.sku='
neq"
WHERE(e.sku!
='
like"
WHERE(e.skulike'
nlike"
WHERE(e.skunotlike'
is"
WHERE(e.skuis'
in"
array('
WHERE(e.skuin('
nin"
WHERE(e.skunotin('
notnull"
WHERE(e.skuisNOTNULL)
null"
WHERE(e.skuisNULL)
gt"
WHERE(e.sku>
'
lt"
WHERE(e.sku<
gteq"
moreq"
)//aweird,secondwaytodogreaterthanequal
lteq"
finset"
WHERE(find_in_set('
e.sku))
from'
10'
to'
20'
WHEREe.sku>
ande.sku<
其中大多数是自我的理解,但有几个得特别注意。
in,nin,find_in_setinandnin条件句中,语序你传入一个数组作为值。
例如:
ABC123'
notnull,null关键字NULL是最特殊的sql句,它将忽略你传入的值。
from–to过滤这是另一种过滤方式,在传入的数组中,允许你传入两个键,是从哪里到哪里的意思,一个数值区间。
publicfunctiontestAction
上面等同于
WHERE(_table_price.value>
AND_table_price.value<
AND或者OR根据刚才讲的内容,你可以知道,通过多个addFieldToFilter方法可以获得一个”AND”的条件句。
functiontestAction()
echo(
like'
a%'
b%'
等同于下面的子句
WHERE(e.skuLIKE'
)AND(e.skuLIKE'
但是,聪明的你可以发现,上面的例子不可能返回任何结果,因为一个sku不可能以a开头,同时也以b开头。
我们希望用的应该是”OR”,那么如何实现呢?
这又使我们将焦点集中到了addFieldToFilter方法的第二个参数上。
如果你希望构造一个or的语句,首先我们构造两个参数。
$filter_a=array('
$filter_b=array('
然后将它们作为一组参数传入addFiel