1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 | <?php /** * Created by PhpStorm. * User:ajiang-tuzhi * QQ:1050653098@qq.com * WebSite:www.weicot.com * Date: 2015/11/12 * Time: 11:54 */ class Aps_Weicot_productsController extends Mage_Core_Controller_Front_Action { public function indexAction() { /*模型数据收集器(Model Collections) 前面我们有提到, 所有Magento的模型数据收集器都继承Varien_Data_Collectionm, 所以理论上我们可以使用之前的所有方法。下面让我们以product模型实战下。*/ $COP = Mage::getModel( 'catalog/product' )->getCollection(); $COP ->getFirstitem()->getData(); //array(11) { ["entity_id"]=> string(1) "1" // ["entity_type_id"]=> string(1) "4" // ["attribute_set_id"]=> string(1) "4" // ["type_id"]=> string(6) "simple" // ["sku"]=> s /*基本所有的Magento模型都有个方法叫getCollection默认情况下, 它会返回系统中所有的数据。 Magento的数据收集器Collection包含很多复杂的逻辑来处理数据, 无论是否使用索引或缓存、EAV表等。 上面的产品数据收集器,它里面还有Varien_Data_Collection_Db类。 这个类给你很多有用的方法,例如如果你向看sql的select语句。*/ $COP ->getSelect(); //object(Varien_Db_Select)#40 (4) // { ["_bind":protected]=> array ...Zend_Cache_Backend_File // Zend_Cache_Core... //var_dump((string)$COP->getSelect()); //上面的方法将输出 /*"SELECT `e`.*, `price_index`.`price`, `price_index`.`tax_class_id`, `price_index`. `final_price`, IF(price_index.tier_price IS NOT NULL, 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来添加它们。让我们看看例子。 */ $COFS = Mage::getModel( 'catalog/product' ) ->getCollection() // ->addAttributeToSelect('*');//the asterisk is like a sql select /*SELECT `e`.*, `price_index`. `price`, `price_index`.`tax_class_id`, `price_index`.`final_price`, IF(price_index.tier_price IS NOT NULL, 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 或者你也可以只选某一个字 or just one*/ ->addAttributeToSelect( 'meta_title' ) /* SELECT `e`.*, `price_index`.`price`, `price_index`. `tax_class_id`, `price_index`.`final_price`, IF(price_index.tier_price IS NOT NULL, 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 *************************** 1. row *************************** entity_id: 1 entity_type_id: 4 attribute_set_id: 4 type_id: simple sku: puma 2012080705 has_options: 1 required_options: 0 created_at: 2015-11-12 08:55:04 updated_at: 2015-11-12 08:55:04 price: 64.9900 tax_class_id: 0 final_price: 58.4900 minimal_price: 58.4900 min_price: 58.4900 max_price: 58.4900 tier_price: NULL *************************** 2. row *************************** entity_id: 2 entity_type_id: 4 attribute_set_id: 4 type_id: simple sku: puma 2012080706 has_options: 1 required_options: 0 created_at: 2015-11-12 08:55:13 updated_at: 2015-11-12 08:55:13 price: 199.9900 tax_class_id: 0 final_price: 179.9900 minimal_price: 179.9900 min_price: 179.9900 max_price: 179.9900 tier_price: NULL *************************** 3. row *************************** entity_id: 3 //或者更多 */ ->addAttributeToSelect( 'price' ); } public function getAction(){ //过滤数据(Filtering Database Collections) //最重要的一个方法是addFieldToFilter。通过这个方法可以添加我们sql中的WHERE语句。 $COP = Mage::getModel( 'catalog/product' )->getCollection(); $COP ->addFieldToFilter( 'sku' , '10086' ); //实践者注:这个将会获得 所有有关这个的数据 //addFieldToFilter方法中的第一个参数是你想过滤的字段名称, ////第二个是你想过滤的值。例如刚刚sku是字段名称,10086是值 //第二个参数也可以被用来指定某一类型的数据。 $COP ->getFirstitem()->getData(); //end /*array(11) { ["entity_id"]=> string(2) "12" ["entity_type_id"]=> string(1) "4" ["attribute_set_id"]=> string(1) "4" ["type_id"]=> string(6) "simple" ["sku"]=> string(5) "10086" ["has_options"]=> string(1) "1" ["required_options"]=> string(1) "1" ["created_at"]=> string(19) "2015-11-13 01:43:53" ["updated_at"]=> string(19) "2015-11-13 02:21:14" ["is_salable"]=> string(1) "1" ["stock_item"]=> object(Varien_Object)#32 (7) { ["_data":protected]=> array(1) { ["is_in_stock"]=> string(1) "1" } ["_hasDataChanges":protected]=> bool(false) ["_origData":protected]=> NULL ["_idFieldName":protected]=> NULL ["_isDeleted":protected]=> bool(false) ["_oldFieldsMap":protected]=> array(0) { } ["_syncFieldsMap":protected]=> array(0) { } } }*/ $T1 =(string)Mage::getModel( 'catalog/product' ) ->getCollection() ->addFieldToFilter( 'sku' , '10086' ) ->getSelect(); //tring(77) "SELECT `e`.* FROM `catalog_product_entity` AS `e` WHERE (`e`.`sku` = '10086')" //但是这个很快会变得很复杂。试着做下面的练习。 var_dump((string)Mage::getModel( 'catalog/product' ) ->getCollection() ->addAttributeToSelect( '*' ) ->addFieldToFilter( 'meta_title' , 'my titlt' ) //过滤字段 // ->getSelect() ); /*SELECT `e`.*, IF(at_meta_title.value_id > 0, at_meta_title.value, at_meta_title_default.value) AS `meta_title` FROM `catalog_product_entity` AS `e` INNER JOIN `catalog_product_entity_varchar` AS `at_meta_title_default` ON (`at_meta_title_default`.`entity_id` = `e`.`entity_id`) AND (`at_meta_title_default`.`attribute_id` = '82') AND `at_meta_title_default`.`store_id` = 0 LEFT JOIN `catalog_product_entity_varchar` AS `at_meta_title` ON (`at_meta_title`.`entity_id` = `e`.`entity_id`) AND (`at_meta_title`.`attribute_id` = '82') AND (`at_meta_title`.`store_id` = 1) WHERE (IF(at_meta_title.value_id > 0, at_meta_title.value, at_meta_title_default.value) = 'my titlt') *在你有空的时候可以好好研究下上面的sql语句, * 我们先不转移焦点,继续我们下面的讲解。 其它比较运算符 我确定在刚刚的练习中,你想知道如何实现一个不是“=”的where条件句,例如不等于、大于、 小于。刚刚我们有讲过addFieldToFilter的第二个参数允许传入不同“类型”。 其实很简单,只要将一个简单的数组作为第二个参数传入addFieldToFilter方法就可以变换条件句。 数组的键就是“类型”,关联的值就是你想过滤的值。我们改写下上面的代码。 * */ var_dump((string)Mage::getModel( 'catalog/product' ) ->getCollection() ->addFieldToFilter( 'sku' , array ( 'eq' => '10086' )) //过滤字段 //string(0) "" string(77) "SELECT `e`.* FROM `catalog_product_entity` AS `e` WHERE (`e`.`sku` = '10086')" ->getSelect() /*看上面的过滤器 addFieldToFilter('sku',array('eq'=>'n2610')) * 看上面的过滤器 addFieldToFilter('sku',array('eq'=>'n2610')) 正如你看到的,第二个参数是一个php的数组。它的键是“eq”,代表等于的意思。 到参考--资料察看 在这里我将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 CopAction(){ var_dump((string)Mage::getModel( 'catalog/product' ) ->getCollection() ->addFieldToFilter( 'price' , array ( 'from' => '40' , 'to' => '60' )) //过滤字段 //string(0) "" string(77) "SELECT `e`.* FROM `catalog_product_entity` AS `e` WHERE (`e`.`sku` = '10086')" ->getSelect()); /*mysql> SELECT `e`.*, `at_price`.`value` AS `price` FROM `catalog_product_entity` AS `e` INNER JOIN ` catalog_product_entity_decimal` AS `at_price` ON (`at_price`.`entity_id` = `e`.`entity_id`) AND (`at_price`.`attribute_id` = '75') AND (`at_price`.`store_id` = 0) WHERE (at_price.value >= '40' AND at_price.value <= '60'); +-----------+----------------+------------------+---------+-----------------+-------------+------------------+---------------------+---------------------+---------+ | entity_id | entity_type_id | attribute_set_id | type_id | sku | has_options | required_options | created_at | updated_at | price | +-----------+----------------+------------------+---------+-----------------+-------------+------------------+---------------------+---------------------+---------+ | 4 | 4 | 4 | simple | puma 2012080711 | 1 | 0 | 2015-11-12 08:55:18 | 2015-11-12 08:55:18 | 59.9900 | | 5 | 4 | 4 | simple | puma 2012080714 | 1 | 0 | 2015-11-12 08:55:20 | 2015-11-12 08:55:20 | 59.9900 | | 10 | 4 | 4 | simple | puma 2012080725 | 1 | 0 | 2015-11-12 08:55:31 | 2015-11-12 08:55:31 | 49.9000 | | 11 | 4 | 4 | simple | puma 2012080726 | 1 | 0 | 2015-11-12 08:55:33 | 2015-11-12 09:45:29 | 49.9000 | | 12 | 4 | 4 | simple | 10086 | 1 | 1 | 2015-11-13 01:43:53 | 2015-11-13 02:21:14 | 49.9000 | +-----------+----------------+------------------+---------+-----------------+-------------+------------------+---------------------+---------------------+---------+ 5 rows in set (0.03 sec) 面等同于 WHERE (_table_price.value >= '10' AND _table_price.value <= '20') AND 或者 OR 根据刚才讲的内容,你可以知道,通过多个 addFieldToFilter方法可以获得一个”AND”的条件句。 */ } public function Mcop() { 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%')*/ public function Mcop1tAction() { /*WHERE (e.sku LIKE 'a%') AND (e.sku LIKE 'b%') 但是,聪明的你可以发现,上面的例子不可能返回任何结果,因为一个sku不可能以a开头,同时也以b开头。 我们希望用的应该是”OR”,那么如何实现呢?这又使我们将焦点集中到了addFieldToFilter方法的第二个参数上。 如果你希望构造一个or的语句,首先我们构造两个参数。*/ $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语句,就可以获取几乎所有模型的所有你想要的数据。 */ //好了来咱们来动手练看看 public function getinfoAction(){ $products =Mage::getModel( 'catalog/product' ) ->getCollection() ->addAttributeToFilter( 'sku' , '10086' ) ->addAttributeToSelect( '*' ) ->load(); foreach ( $products as $_product ){ print_r( $_product ->getData()); } } /* * rray ( [entity_id] => 12 * [entity_type_id] => 4 [attribute_set_id] => 4 [type_id] => simple * [sku] => 10086 [has_options] => 1 [required_options] => 1 [created_at] => 2015-11-13 01:43:53 [updated_at] => 2015-11-13 02:21:14 [manufacturer] => [color] => [status] => 1 [is_recurring] => 0 [visibility] => 4 [tax_class_id] => 0 [ac] => 5 [price] => 49.9000 [special_price] => 49.9000 [weight] => 1.0000 [msrp] => [name] => Puma Youth PowerCat 3.12 Gravity FG - Fluo Blue with New Navy and Orange [meta_title] => [meta_description] => [image] => /P/u/Puma_Youth_PowerCat_3.12_Gravity_FG_-_Fluo_Blue_with_New_Navy_and_Orange_1.jpg [small_image] => /P/u/Puma_Youth_PowerCat_3.12_Gravity_FG_-_Fluo_Blue_with_New_Navy_and_Orange_1.jpg [thumbnail] => /P/u/Puma_Youth_PowerCat_3.12_Gravity_FG_-_Fluo_Blue_with_New_Navy_and_Orange_1.jpg => /Puma Youth PowerCat 3.12 Gravity FG - Fluo Blue with New Navy and Orange_138.jpg;/soccercleatsus87/Puma Youth PowerCat 3.12 Gravity FG - Fluo Blue with New Navy and Orange_139.jpg; * /soccercleatsus87/Puma Youth PowerCat 3.12 Gravity FG - Fluo Blue with New [url_key] => puma-youth-powercat-3-12-gravity*/ } |
Magento数据操作&数据收集器 学习2
与本文相关的文章
- 服务器 站群 开发 管理 同步 脚本生成器 包含 部署 更新 等 Magento 版
- 创建一个 Magento 2 带视图的模块
- Magento Url 结构优化 SEO
- Magento 2 获得目录 及子目录 备忘
- Magento 插件 ajax 修改购物车数量 以及 ajax 加入购物车等
- 大气的 Magento supershop 模板
- 产品 列表页 ajax 加载产品 弹出层方式
- Magento Weicot Json Api 文档 可用于 Java 和 JavaScript 等
- 银联新一代商户接入新接口-支付 以 Magento银联新接口开发为例
- Magento 1x 全局价格规则控制 以及快速定位 文件及JS
- Magento 1x 插件 及接口 列表
- Magento 2 使用 Smtp 发送邮件 Magento 2- Send Mail Using Your Smtp Server