Magento 1.9:获取将商品X设为Upsell的商品列表
嘿,这个需求我刚好在做换货系统时碰到过类似的,完全不用遍历整个商品集合,给你几个高效的方案:
1. 直接用数据库关联查询(最推荐)
电商系统里的Upsell关联关系一般都会存在专门的关联表(比如product_upsell),字段大概是parent_product_id(设置Upsell的商品ID)、upsell_product_id(被设置为Upsell的商品ID),再结合分类ID过滤,直接写SQL就能精准捞到目标商品:
SELECT p.product_name FROM products p INNER JOIN product_upsell upl ON p.id = upl.parent_product_id WHERE upl.upsell_product_id = [商品X的ID] AND p.category_id = [目标分类ID]
优化点:给product_upsell表的upsell_product_id和parent_product_id加联合索引,给products表的category_id加索引,这会让查询速度快到飞起,完全不用碰全量商品数据。
2. 利用电商平台API的过滤参数(如果是用成熟平台)
如果你用的是WooCommerce、Shopify这类成熟电商系统,它们的API都支持直接过滤关联关系+分类:
WooCommerce REST API示例:
GET /wp-json/wc/v3/products?category=[目标分类ID]&meta_key=_upsell_ids&meta_value=[商品X的ID]&meta_compare=LIKE这里
meta_compare=LIKE是因为_upsell_ids存储的是商品ID数组,用LIKE匹配包含商品X ID的记录。Shopify GraphQL示例:
query GetUpsellingProducts { products(first: 50, query: "product_type:[目标分类名称] AND upsell:[商品X的Handle]") { edges { node { title } } } }
3. 自定义系统里的ORM关联优化
如果是自己开发的系统,可以给商品模型加一个反向关联:
// 以Laravel为例,在Product模型中 public function productsThatUpsellMe() { return $this->hasMany(Product::class, 'id', 'upsell_product_id') ->where('category_id', [目标分类ID]); }
之后调用$productX->productsThatUpsellMe就能直接拿到所有符合条件的商品,ORM会自动生成高效的SQL查询,不用手动处理遍历逻辑。
额外优化:缓存结果
因为Upsell关联关系不会频繁变动,把查询到的商品列表缓存起来(比如Redis、文件缓存或者平台自带的缓存机制),下次请求直接取缓存,进一步降低数据库压力。
之前我用第一个方案+缓存,处理几百个关联商品的场景,页面加载速度比遍历全量集合快了至少10倍,完全解决了性能问题。
内容的提问来源于stack exchange,提问作者Niels

