根据 final_price 获取 Magento 2 集合

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 属性中的价格范围?

谢谢,

Mat*_*ell 5

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