第九章数据操作数据收集器Word文档下载推荐.docx

上传人:b****2 文档编号:617418 上传时间:2023-04-29 格式:DOCX 页数:14 大小:19.93KB
下载 相关 举报
第九章数据操作数据收集器Word文档下载推荐.docx_第1页
第1页 / 共14页
第九章数据操作数据收集器Word文档下载推荐.docx_第2页
第2页 / 共14页
第九章数据操作数据收集器Word文档下载推荐.docx_第3页
第3页 / 共14页
第九章数据操作数据收集器Word文档下载推荐.docx_第4页
第4页 / 共14页
第九章数据操作数据收集器Word文档下载推荐.docx_第5页
第5页 / 共14页
第九章数据操作数据收集器Word文档下载推荐.docx_第6页
第6页 / 共14页
第九章数据操作数据收集器Word文档下载推荐.docx_第7页
第7页 / 共14页
第九章数据操作数据收集器Word文档下载推荐.docx_第8页
第8页 / 共14页
第九章数据操作数据收集器Word文档下载推荐.docx_第9页
第9页 / 共14页
第九章数据操作数据收集器Word文档下载推荐.docx_第10页
第10页 / 共14页
第九章数据操作数据收集器Word文档下载推荐.docx_第11页
第11页 / 共14页
第九章数据操作数据收集器Word文档下载推荐.docx_第12页
第12页 / 共14页
第九章数据操作数据收集器Word文档下载推荐.docx_第13页
第13页 / 共14页
第九章数据操作数据收集器Word文档下载推荐.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

第九章数据操作数据收集器Word文档下载推荐.docx

《第九章数据操作数据收集器Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《第九章数据操作数据收集器Word文档下载推荐.docx(14页珍藏版)》请在冰点文库上搜索。

第九章数据操作数据收集器Word文档下载推荐.docx

首先,我们创造一些新的对象。

$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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2