Magento 通过属性获取产品和目录

Magento 通过属性获取产品和目录

在这一章节里, 我们来了解如何轻松的利用 Collection 来通过某一个属性(Attribute)获取产品(Product)和目录(Category)

 

通过 SKU 获取产品 Load a Product by SKU

 

SKU 不像其他产品属性, 它是一个静态属性, 这就意味着它不会被存储在任何一个产品 EAV 表中, 而存储在主要的产品实体表中(catalog_product_entity), 所以想通过 SKU 来获取产品将变得非常有效率

1
2
3
4
5
6
7
8
9
10
<?php
  
$sku     = 'my-product-sku' ;
$product = Mage::getModel( 'catalog/product' )->load( $sku , 'sku' );
  
if ( $product ->getId()) {
     echo $product ->getName();
} else {
     echo 'Product not found with SKU of ' . $sku ;
}

上述代码中我们调用了 load() 方法, 在 Magento 中它适用于所有的 EAV 实体
这个方法默认带有两个参数, 第一个用来匹配我们想获取的产品, 如果第二个参数为空, Magento 会默认使用主键, 所以我们通常只要传入产品 ID 就能获得产品, 在这里我们传入 'sku', 当然你也可以通过其他属性获得

 

通过属性(Attribute)获取产品 Load a Product by an Attribute

 

除了 SKU, 大部分的产品属性并不是静态的, 它们的值被分别储存在不同的表里, 然而我们也经常用到, 所以通过这些属性去获取产品效率将会有所降低, 因为它需要多表联询来获取你想要的产品, 这里我说这些并不是建议你不要这么做, 而是让你了解它的特性,以达到合理使用

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
<?php
  
// 初始化产品 Collection 对象
$products = Mage::getResourceModel( 'catalog/product_collection' );
  
// 选择产品中你所需要的列
// * 代表所有列, 不过你也可以传数组来选择你想要的列
$products ->addAttributeToSelect( '*' );
  
// 确保该产品是可见的
$products ->addAttributeToFilter( 'visibility' , array ( 'neq' => 1));
  
// 确保该产品是启用的
$products ->addAttributeToFilter( 'status' , 1);
  
// 添加过滤条件,name
$products ->addAttributeToFilter( 'name' , 'My Product Name' );
 
// 限制该 collection 的结果
$products ->setCurPage(1)->setPageSize(1);
  
// 获取 collection
$products ->load();
  
if ( $products ->getFirstItem()) {
     $product = $products ->getFirstItem();
     echo $product ->getName();
} else {
     echo 'No product exists with the name ' . $name ;
}

到这里,你可以看出如上代码远远多于通过 SKU 获取, 但是你同样也可以看出 Magento collection 强大的功能性和灵活性。第 16 行就相当于一个 WHERE 语句, 用 name 来过滤, 其他的代码只是为了确保该产品的有效性

 

如果你想看看 SQL 语句到底是什么样的, 你可以做以下操作

1
2
3
4
<?php
      
// 输出 SQL 语句
echo $products ->getSelect() . '<br><br>' ;

 

通过属性(Attribute)获取目录(Category) Load a Category by an Attribute

 

通过属性来获取目录只有略微的不同, 主要的原因是产品和目录都是采用 Magento EAV 数据结构, 并都继承同一个基类, 该基类提供核心 Collection 功能

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
<?php
 
// 初始化目录 Collection 对象
$categories = Mage::getResourceModel( 'catalog/categories_collection' );
      
// 选择目录中你所需要的列
// * 代表所有列, 不过你也可以传数组来选择你想要的列
$categories ->addAttributeToSelect( '*' );
  
// 确保该目录是激活状态的
$categories ->addAttributeToFilter( 'is_active' , 1);
  
// 添加过滤条件,name
$categories ->addAttributeToFilter( 'name' , 'My Category Name' );
 
// 限制该 collection 的结果
$categories ->setCurPage(1)->setPageSize(1);
  
// 获取 collection
$categories ->load();
  
if ( $categories ->getFirstItem()) {
     $category = $categories ->getFirstItem();
     echo $category ->getName();
} else {
     echo 'No category exists with the name ' . $name ;
}

可以看出主要的区别在于不同的 Resource 模型(line#3)和不同的属性过滤`is_active`

 

到这里, 你应该可以看出 Magento collection 的灵活性和强大的功能性, 我建议刚开始接触的开发者可以经常输出 SQL 语句来了解 Magento 都在做些什么, 如果你能更好的理解, 那你将会成为一个很好的开发者

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值