Magento – Magento2 product collection empty

magento2product-collection

Can anyone tell me how to get the product collection from the below method.
Is this the right way of fetching data in magento2?

\Vendor\Module\Helper\Data $tglssearchHelper,


protected function _getProductCollection()
{
    $tagalys = $this->tglssearchHelper->getTagalysSearchData(); 

        if ($tagalys == false) {
            return parent::_getProductCollection();
        } else {

        $searchResult = $tagalys;

        if (empty($searchResult)) {
            return parent::_getProductCollection();
        }

        $collection = $this->_productCollection = $this->catalogResourceModelProductCollectionFactory->create()
             ->addAttributeToSelect($this->catalogConfig->getProductAttributes())
             ->setStore($this->storeManager->getStore())
             ->addFieldToFilter('visibility', \Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
             ->addAttributeToFilter( 'entity_id', array( 'in' => $searchResult['results'] ) );  echo 'list product';print_r($collection);die;

        $orderString = array('CASE e.entity_id');
        foreach($searchResult['results'] as $i => $productId) {
            $orderString[] = 'WHEN '.$productId.' THEN '.$i;
        }
        $orderString[] = 'END';
        $orderString = implode(' ', $orderString);

        $collection->getSelect()->order(new \Zend_Db_Expr($orderString));

        return $this->_productCollection;
    }
}

My helper /Data

public function getTagalysSearchData()
{   
    $service = $this->isTagalysActive(); 
    if ($service) {
        $searchResult = $service->getSearchResult();  
        return $searchResult;
    } else {
        return false;
    }
}

Im not getting any product collection returned?
where am i wrong?

Best Answer

The authentic and recommended way to fetch product collection is to use API interface

Magento\Catalog\Api\ProductRepositoryInterface

method

getList(\Magento\Framework\Api\SearchCriteriaInterface $searchCriteria)

for this you need to build the search criteria first

Your class should include below classes -

use Magento\Catalog\Api\ProductRepositoryInterface;
use Magento\Framework\Api\SearchCriteriaBuilder;
use Magento\Catalog\Model\Product\Type;
use Magento\Catalog\Model\Product\Visibility;
use Magento\Catalog\Model\Product\Attribute\Source\Status;

Class constructor should be -

/** @var ProductRepositoryInterface  */
protected $productRepository;

/** @var SearchCriteriaBuilder  */
protected $searchCriteriaBuilder;

/** @var Visibility  */
protected $productVisibility;

/** @var Status  */
protected $productStatus;

/**
 * Edit constructor.
 * @param ProductRepositoryInterface $productRepositoryInterface
 * @param SearchCriteriaBuilder $searchCriteriaBuilder
 * @param Visibility $visibility
 * @param Status $status
 */
public function __construct(
    ProductRepositoryInterface $productRepositoryInterface,
    SearchCriteriaBuilder $searchCriteriaBuilder,
    Visibility $visibility,
    Status $status
) {
    $this->productRepository = $productRepositoryInterface;
    $this->searchCriteriaBuilder = $searchCriteriaBuilder;
    $this->productVisibility = $visibility;
    $this->productStatus = $status;
}

Get list method should be -

/**
 * @return array
 */
public function getProductList()
{
    $searchCriteriaBuilder = $this->searchCriteriaBuilder
        ->addFilter('type_id', Type::TYPE_SIMPLE, 'eq')
        ->addFilter('status', $this->productStatus->getVisibleStatusIds(), 'in')
        ->addFilter('visibility', $this->productVisibility->getVisibleInCatalogIds(), 'in')
        ->create();

    $productList = $this->productRepository->getList($searchCriteriaBuilder);
    //echo $productList->getTotalCount();
    $items = $productList->getItems();

    return $items;
}