Skip to content

Instantly share code, notes, and snippets.

@DominicWatts
Last active November 24, 2023 10:30
Show Gist options
  • Save DominicWatts/3d5bb080628902a29f54bf6652b60062 to your computer and use it in GitHub Desktop.
Save DominicWatts/3d5bb080628902a29f54bf6652b60062 to your computer and use it in GitHub Desktop.
magento 2 product collection cheatsheet

Product Collection Cheatsheet

Import statement

use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory as ProductCollectionFactory;

/**
 * @var ProductCollectionFactory
 */
private $productCollectionFactory;

/**
 * @param ProductCollectionFactory $productCollectionFactory
 */
public function __construct(
    ProductCollectionFactory $productCollectionFactory
) {
    $this->productCollectionFactory = $productCollectionFactory;
}

Product Types

\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE
\Magento\Catalog\Model\Product\Type::TYPE_BUNDLE
\Magento\Catalog\Model\Product\Type::TYPE_VIRTUAL
\Magento\Downloadable\Model\Product\Type::TYPE_DOWNLOADABLE
\Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE
\Magento\GroupedProduct\Model\Product\Type\Grouped::TYPE_CODE

Visibility filter

/**
 * @var \Magento\Catalog\Model\Product\Visibility
 */
protected $productVisibility;

public function __construct(
    \Magento\Catalog\Model\Product\Visibility $productVisibility,
) {
    $this->productVisibility = $productVisibility;
}

[...]
$collection->setVisibility($this->productVisibility->getVisibleInSiteIds());
[...]

Create

$collection = $this->productCollectionFactory->create();

Filters

// Is Equal To
$collection->addAttributeToFilter('status', ['eq' => 1]);

// Is Not Equal To
$collection->addAttributeToFilter('visibility', ['neq' => 1]);

// Greater Than
$collection->addAttributeToFilter('price', ['gt' => 3]);

// Less Than
$collection->addAttributeToFilter('price', ['lt' => 3]);

// Greater Than or Equal To
$collection->addAttributeToFilter('price', ['gteq' => 4]);

// Less Than or Equal To
$collection->addAttributeToFilter('price', ['lteq' => 4]);

// Contains – with % wildcards
$collection->addAttributeToFilter('sku', ['like' => 'DVD%']);

// Does Not Contain – with % wildcards
$collection->addAttributeToFilter('sku', ['nlike' => 'ABC%']);

// In Array
$collection->addAttributeToFilter('entity_id', ['in' => [1,3,12]]);

// Not In Array
$collection->addAttributeToFilter('entity_id', ['nin' => [1,2,12]]);

// Is NULL
$collection->addAttributeToFilter('description', 'null');
$collection->addAttributeToFilter('description', ['null' => true]);

// Is Not NULL
$collection->addAttributeToFilter('description', 'notnull');
$collection->addAttributeToFilter('description', ['notnull' => true]);

Add Price Data

$collection->addPriceData();

Simple filter

$collection->addAttributeToFilter('type_id', $typeFilter);

More complex filter

$collection->addAttributeToFilter(
    'status',
    ['in' => 'processing']
);

Even more complex filter

$collection->addPriceData();
[...]
$complexCollection = clone $collection;
$complexCollection->getSelect()
    ->where('price_index.min_price >= 100')
    ->where('price_index.min_price <= 200');
$ids = $complexCollection->getAllIds();
$collection->addAttributeToFilter('entity_id', array('in' => $ids));

Or filter

$collection->addAttributeToFilter([
    [
        'attribute' => 'download_link',
        'null' => true,
    ],
    [
        'attribute' => 'download_link',
        'eq' => '',
    ],
]);
$collection->addFieldToFilter([
    ['download_link', 'download_link'],
    [
        ['is' => new \Zend_Db_Expr('null')],
        ['eq' => '']
    ],
]);
$collection->addFieldToFilter(
    ['download_link', 'download_link'],
    [
        ['null' => true],
        ['eq' => '']
    ]
);

In Stock Filter

/**
 * @var \Magento\CatalogInventory\Helper\Stock
 */
protected $stockHelper;

public function __construct(
     \Magento\CatalogInventory\Helper\Stock $stockHelper
) {
     $this->stockHelper = $stockHelper;
}

[...]
$this->stockHelper->addInStockFilterToCollection($collection);
[...]

Get Price Data

$collection->getMaxPrice();
$collection->getMinPrice();
$collection->getPriceStandardDeviation();
$collection->getPricesCount();

Filter by Product ID

$collection->addIdFilter($productId);

Filter by Store ID

$collection->addStoreFilter($storeId);

Select Attribute

$collection->addAttributeToSelect($attributeCode);
$collection->addAttributeToSelect('*'); // all

Configured

use Magento\Catalog\Model\Config;
public function __construct(
    [...]
    Config $config
    [...]
} {
    $this->config = $config;
}

$attributes = $this->config->getProductAttributes();
$collection->addAttributeToSelect($attributes);

Get first item

return $collection->getFirstItem();

Get raw attribute value

return $collection->getFirstItem()->getData($attributeCode);

Status Filter

/**
 * @var Magento\Catalog\Model\Product\Attribute\Source\Status
 */
protected $productStatus;

public function __construct(
    \Magento\Catalog\Model\Product\Attribute\Source\Status $productStatus
) {
    $this->productStatus = $productStatus;
}

[...]

$collection->addAttributeToFilter(
    'status',
    ['in' => $this->productStatus->getVisibleStatusIds()
]);

Category Filter

$collection->addCategoryFilter($category);

Return only IDs

return $collection->getAllIds();

Debug Query

echo (string) $collection->getSelect();
$collection->printLogQuery(true);

Add Media

$collection->addMediaGalleryData();

Add Tier Price Data

$collection->addTierPriceData();
$collection->addTierPriceDataByGroupId($customerGroupId);

Add Category IDs

$collection->addCategoryIds();

Add Website Names

$collection->addWebsiteNamesToResult();

Join Stock Qty to collection

$collection->joinField(
    'qty',
    'cataloginventory_stock_item',
    'qty',
    'product_id=entity_id',
    '{{table}}.stock_id=1',
    'left'
);

Generic Collection

// Sort Collection
// Order by Attribute Ascending
$collection->setOrder('price', 'ASC');
// or 
$collection->getSelect()->order('price ASC');

// Order by Attribute Descending
$collection->setOrder('name', 'DESC');
// or 
$collection->getSelect()->order('name DESC');

// Magento\Catalog\Model\ResourceModel\Product\Collection
$collection->addAttributeToSort('is_saleable', 'ASC');

// Random Order
$collection->setOrder('rand()');
// Random Order product collection factory
$collection->getSelect()->orderRand();
// reset
$collection->getSelect()->reset('order');

// Limit Collection
$collection->setPageSize(10);
$collection->setCurPage(1);

// Count Results
$collection->count();

Add URL data

$collection->addUrlRewrite($categoryId);

Add Tax Percents

$collection->addTaxPercents();

Add Options

$collection->addOptionsToResult();

Add Sort

$collection->addAttributeToSort('name', 'DESC');

Free Up Memory

$collection->clear();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment