I am creating custom rest API for getting all products including out of stock products too but I am not able to get out of stock products.
/**
* Get products with filter.
*
* @param string $fieldName
* @param string $fieldValue
* @param string $filterType
* @return \Magento\Catalog\Api\Data\ProductInterface[]
*/
public function getFeedarmy(\Magento\Framework\Api\SearchCriteriaInterface $searchCriteria) {
$_objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$storesCollection = $this->_storeManager->getStores();
$storeIds = [];
foreach ($storesCollection as $sc) {
$storeIds[] = $sc['store_id'];
}
$items = [];
$productCollection = $this->collectionFactory->create();
$productCollection->setFlag('has_stock_status_filter', false);
$productCollection->setFlag('require_stock_items', false);
//$productCollection->setSkipSaleableCheck(true);
$productCollection->addAttributeToSelect('*')
->setStoreId($storeIds)
//->joinField( 'manage_stock', 'cataloginventory_stock_item', 'manage_stock', 'product_id=entity_id', null, 'left' )
//->addMinimalPrice()
->addCategoryIds()
//->addTierPriceData()
->addPriceData()
//->addMediaGalleryData()
->joinField('inventory_in_stock', 'cataloginventory_stock_item', '*', 'product_ids=entity_id', 'qty>=0', 'left')
//->addAttributeToFilter('is_in_stock', array('in' => ['0','1']))
->addTaxPercents();
$this->collectionModifier->apply($productCollection);
foreach ($searchCriteria->getFilterGroups() as $filterGroups) {
foreach ($filterGroups->getFilters() as $filter) {
$productCollection->addAttributeToFilter($filter->getField(), [$filter->getConditionType() => $filter->getValue()]);
}
}
if (is_array($searchCriteria->getSortOrders()) && count($searchCriteria->getSortOrders())) {
foreach ($searchCriteria->getSortOrders() as $sortOrder) {
$productCollection->addOrder($sortOrder->getField(), $sortOrder->getDirection() == \Magento\Framework\Api\SortOrder::SORT_ASC ? 'ASC' : 'DESC');
}
}
$productCollection->setPageSize($searchCriteria->getPageSize());
$productCollection->setCurPage($searchCriteria->getCurrentPage());
foreach ($productCollection as $item) {
$customOptions = $_objectManager->get('Magento\Catalog\Model\Product\Option')->getProductOptionCollection($item);
$data = $item->getData();
$productCustomOptions = [];
foreach ($customOptions as $k => $co) {
$coData = $co->getData();
$optionValues = [];
foreach ($co->getValues() as $cov) {
$optionValues[] = $cov->getData();
}
$productCustomOptions[] = array(
'option_id' => $coData['option_id'],
'product_id' => $coData['product_id'],
'type' => $coData['type'],
'is_require' => $coData['is_require'],
'sku' => $coData['sku'],
'max_characters' => $coData['max_characters'],
'file_extension' => $coData['file_extension'],
'image_size_x' => $coData['image_size_x'],
'image_size_y' => $coData['image_size_y'],
'sort_order' => $coData['sort_order'],
'default_title' => $coData['default_title'],
'store_title' => $coData['store_title'],
'title' => $coData['title'],
'default_price' => $coData['default_price'],
'default_price_type' => $coData['default_price_type'],
'store_price' => $coData['store_price'],
'store_price_type' => $coData['store_price_type'],
'price' => $coData['price'],
'price_type' => $coData['price_type'],
'values' => $optionValues,
);
}
$items[$item->getId()] = array(
'id' => $item->getId(),
'sku' => $data['sku'],
'name' => $item->getName(),
'url_key' => $item->getUrlKey(),
'attribute_set_id' => $item->getAttributeSetId(),
'store_ids' => $item->getStoreIds(),
'parent_ids' => $this->_catalogProductTypeConfigurable->getParentIdsByChild($item->getId()),
'price' => $data['price'],
'status' => $data['status'],
'visibility' => $data['visibility'],
'type_id' => $data['type_id'],
'created_at' => $data['created_at'],
'updated_at' => $data['updated_at'],
'weight' => $data['weight'],
'weight_unit' => $this->getWeightUnit(),
'product_links' => $item->getProductLinks(),
'tier_prices' => $item->getTierPrices(),
'custom_attributes' => array(
array(
'attribute_code' => 'description',
'value' => $item->getDescription()
),
array(
'attribute_code' => 'image',
'value' => $item->getImage()
),
array(
'attribute_code' => 'small_image',
'value' => $item->getSmallImage()
),
array(
'attribute_code' => 'thumbnail',
'value' => $item->getThumbnail()
),
array(
'attribute_code' => 'color',
'value' => $item->getColor()
),
array(
'attribute_code' => 'category_ids',
'value' => $item->getCategoryIds()
),
),
'stock_information' => array(
'item_id' => $data['item_id'],
'product_id' => $data['product_id'],
'stock_id' => $data['stock_id'],
'qty' => $data['qty'],
'is_in_stock' => $data['is_in_stock'],
'is_qty_decimal' => $data['is_qty_decimal'],
'use_config_min_qty' => $data['use_config_min_qty'],
'min_qty' => $data['min_qty'],
'use_config_min_sale_qty' => $data['use_config_min_sale_qty'],
'min_sale_qty' => $data['min_sale_qty'],
'use_config_max_sale_qty' => $data['use_config_max_sale_qty'],
'max_sale_qty' => $data['max_sale_qty'],
'use_config_backorders' => $data['use_config_backorders'],
'backorders' => $data['backorders'],
'use_config_notify_stock_qty' => $data['use_config_notify_stock_qty'],
'notify_stock_qty' => $data['notify_stock_qty'],
'use_config_qty_increments' => $data['use_config_qty_increments'],
'qty_increments' => $data['qty_increments'],
'use_config_enable_qty_inc' => $data['use_config_enable_qty_inc'],
'enable_qty_increments' => $data['enable_qty_increments'],
'use_config_manage_stock' => $data['use_config_manage_stock'],
'manage_stock' => $data['manage_stock'],
'low_stock_date' => $data['low_stock_date'],
'is_decimal_divided' => $data['is_decimal_divided'],
'stock_status_changed_auto' => $data['stock_status_changed_auto'],
),
'custom_options' => $productCustomOptions,
);
//$items[$item->getId()] = $item;
}
$searchResult = $this->searchResultFactory->create();
$searchResult->setItems($items);
$searchResult->setTotalCount(count($items));
$searchResult->setSearchCriteria($searchCriteria);
return $searchResult;
}
I tried to identify the reason and found that the query for getting the product has joined with kdmcatalog_product_entity
and kdmcatalog_product_index_price
, where if the product is out of stock removed from the kdmcatalog_product_index_price
table so the join does not return the out of stock of products
SELECT `e`.*, `price_index`.`price`, `price_index`.`tax_class_id`, `price_index`.`final_price`, IF(price_index.tier_price IS NOT NULL, LEAST(price_index.min_price, price_index.tier_price), price_index.min_price)
AS `minimal_price`, `price_index`.`min_price`, `price_index`.`max_price`, `price_index`.`tier_price`, `at_inventory_in_stock`.*
FROM `kdmcatalog_product_entity` AS `e` INNER JOIN
`kdmcatalog_product_index_price` AS `price_index` ON price_index.entity_id = e.entity_id AND price_index.website_id = '1' AND price_index.customer_group_id = 0
LEFT JOIN `kdmcataloginventory_stock_item`
AS `at_inventory_in_stock` ON (at_inventory_in_stock.`product_id`=e.entity_id) AND (qty>=0)
WHERE (`e`.`sku` = 'ab,Nike Air Max Dia SE-us 5.5')