Coe*_*sen 3 collections magento2
我有以下代码来获取 Magento 2 产品系列:
<?php namespace Qxs\Related\Block;
class Related extends \Magento\Framework\View\Element\Template
{
public function __construct(
\Magento\Backend\Block\Template\Context $context,
\Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory,
\Magento\Catalog\Model\Product\Attribute\Source\Status $productStatus,
\Magento\Catalog\Model\Product\Visibility $productVisibility,
\Magento\Framework\Registry $registry,
array $data = []
)
{
$this->_productCollectionFactory = $productCollectionFactory;
$this->productStatus = $productStatus;
$this->productVisibility = $productVisibility;
$this->_registry = $registry;
parent::__construct($context, $data);
}
public function getProductCollection()
{
try {
$product = $this->_registry->registry('current_product');
$range_percentage = 35;
$price_temp = round($product->getFinalPrice() / 100 * $range_percentage);
$price_from = $product->getFinalPrice() - $price_temp;
$price_to = $product->getFinalPrice() + $price_temp;
$categories = $product->getCategoryIds();
$collection = $this->_productCollectionFactory->create();
$collection->addAttributeToSelect('*')
->addCategoriesFilter(['in' => $categories])
->addPriceDataFieldFilter('%s >= %s', ['min_price', $price_from])
->addPriceDataFieldFilter('%s <= %s', ['min_price', $price_to])
->addMinimalPrice()
->addAttributeToFilter('entity_id', ['neq' => $product->getId()])
->addAttributeToFilter('status', ['in' => $this->productStatus->getVisibleStatusIds()])
->setVisibility($this->productVisibility->getVisibleInSiteIds())
->setPageSize(5);
return $collection;
} catch (\Exception $e) {
var_dump($e->getMessage());
}
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码更新了一个工作示例
它将返回带有 addtofieldfilter 'price' 的结果,但它不适用于 final_price 属性。我需要根据 final_price 进行排序,因为可配置的产品没有价格。代码返回:无效的属性名称。
如何过滤 final_price 属性中的价格范围?
谢谢,
final_price 是价格索引表的一部分,因此您不能像处理字段和属性那样使用它。您需要加入价格指数才能根据 final_price 进行过滤和排序。幸运的是,Magento 为我们在产品系列中添加了一些漂亮的功能;addPriceDataFieldFilter()和addFinalPrice()。
解决方案
为了能够实现您上面描述的逻辑,您需要将代码更改为如下所示:
$collection = $this->_productCollectionFactory->create();
$collection->addAttributeToSelect('*')
->addCategoriesFilter(['in' => $categories])
->addPriceDataFieldFilter('%s >= %s', ['final_price', $price_from])
->addPriceDataFieldFilter('%s <= %s', ['final_price', $price_to])
->addFinalPrice()
->addAttributeToFilter('entity_id', ['neq' => $product->getId()])
->addAttributeToFilter('status', ['in' => $this->productStatus->getVisibleStatusIds()])
->setVisibility($this->productVisibility->getVisibleInSiteIds())
->setPageSize(5);
Run Code Online (Sandbox Code Playgroud)
注意函数的顺序。您必须始终addFinalPrice()在所有之后调用,addPriceDataFieldFilter()否则将不会应用过滤器。
奖金
如果要按 final_price 排序,可以在 之后添加以下代码addFinalPrice():
$collection->getSelect()->order('price_index.final_price ASC');
Run Code Online (Sandbox Code Playgroud)
参考
https://github.com/magento/magento2/blob/2.2.9/app/code/Magento/Catalog/Model/ResourceModel/Product/Collection.php#L1465 https://github.com/magento/magento2/blob /2.2.9/app/code/Magento/Catalog/Model/ResourceModel/Product/Collection.php#L2265