How to get in stock product collection by category id in Magento 2.3.3?
-
28-03-2021 - |
Question
I'm using Magento 2.3.3 with multiple websites store that uses different multiple stock sources(multi inventory) and I tried to retrieve product collection by category id like this:
public function __construct(
\Magento\Catalog\Model\Product\Visibility $catalogProductVisibility,
\Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productsCollectionFactory,
\Magento\Catalog\Model\CategoryFactory $categoryFactory
){
$this->_catalogProductVisibility = $catalogProductVisibility;
$this->_productCollectionFactory = $productsCollectionFactory;
$this->_categoryFactory = $categoryFactory;
}
$collection = $this->_productCollectionFactory->create();
$category = $this->_categoryFactory->create()->load(3);
$_collection->setVisibility($this->_catalogProductVisibility->getVisibleInCatalogIds());
$_collection->addFieldToFilter('status', array('eq' => \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED));
$_collection = $this->_addProductAttributesAndPrices($_collection)
->setCurPage(1);
$_collection->setPageSize($7);
$_collection->addCategoryFilter($category);
$_collection->addAttributeToFilter('is_featured',1);
$_collection->setOrder('created_at','desc');
return $_collection;
The collection will show both in stock and out of stock product collection, how can I filter out the out of stock product and only show the in-stock product collection?
Thanks in advance..!
Solution
To get instock product collection. include catalogInventory stock helper class
protected $stockFilter;
public function __construct(
\Magento\Catalog\Model\Product\Visibility $catalogProductVisibility,
\Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productsCollectionFactory,
\Magento\Catalog\Model\CategoryFactory $categoryFactory,
\Magento\CatalogInventory\Helper\Stock $stockFilter
){
$this->_catalogProductVisibility = $catalogProductVisibility;
$this->_productCollectionFactory = $productsCollectionFactory;
$this->_categoryFactory = $categoryFactory;
**$this->stockFilter = $stockFilter;**
}
$collection = $this->_productCollectionFactory->create();
$category = $this->_categoryFactory->create()->load(3);
$_collection->setVisibility($this->_catalogProductVisibility->getVisibleInCatalogIds());
$_collection->addFieldToFilter('status', array('eq' => \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED));
$_collection = $this->_addProductAttributesAndPrices($_collection)->setCurPage(1);
$this->stockFilter->addInStockFilterToCollection($_collection);// return instock product collection only
$_collection->setPageSize($7);
$_collection->addCategoryFilter($category);
$_collection->addAttributeToFilter('is_featured',1);
$_collection->setOrder('created_at','desc');
return $_collection;
Need to add addInstockFilterToCollection to get only Instock collection. please accept anser if it is helpful. Thanks
Licensed under: CC-BY-SA with attribution
Not affiliated with magento.stackexchange