X

Magento 2: Как удалить условие из коллекции

Бывают случаи, когда требуется удалить часть условия из SQL запроса коллекции. Т.к. в Magento активно используют наследование и различные переопределения, то найти все условия которые добавили в коллекцию бывает затруднительно. На выручку приходит препарирование запроса средствами Zend..

Прежде всего о том, как посмотреть результирующий запрос

/** @var \Magento\Eav\Model\Entity\Collection\AbstractCollection $collection */
$select = $collection->getSelect();

$sql = $select->__toString();

echo htmlspecialchars($sql);

exit;

далее посмотрим какие есть условия в запроса

/** @var \Magento\Eav\Model\Entity\Collection\AbstractCollection $collection */
$select = $collection->getSelect(); 

$where = $select->getPart(\Zend_Db_Select::WHERE);
foreach ($where as $key => $condition)
{
    echo '['.$key.'] '.htmlspecialchars($condition).PHP_EOL;
}

exit;

Теперь, когда мы знаем какие части у нас доступны, мы их можем заменить таким образом, чтобы наш запрос не поломался. А затем собрать его обратно. Например, вот так

/** @var \Magento\Eav\Model\Entity\Collection\AbstractCollection $collection */
$select = $collection->getSelect(); 

$where = $select->getPart(\Zend_Db_Select::WHERE);
foreach ($where as $key => $condition)
{
    if ($condition == "(`e`.`product_id` IN(NULL))") {
        $where[$key] = '(1=1)';
    }
}
$select->setPart(\Zend_Db_Select::WHERE, $where);

echo $select->__toString();

exit;

Разумеется, так делать не стоит, использовать подобные хитрости нужно только во время отладки.

--[добавлено]--

Очистить все условия в Where чтобы добавить новые через getAttributeToFilter можно так

$сollection->getSelect()->reset(\Zend_Db_Select::WHERE);
$сollection->addAttributeToFilter('product_id', $productId);

Категории: CMS Magento