Magento 2: Как удалить условие из коллекции
Бывают случаи, когда требуется удалить часть условия из SQL запроса коллекции. Т.к. в Magento активно используют наследование и различные переопределения, то найти все условия которые добавили в коллекцию бывает затруднительно. На выручку приходит препарирование запроса средствами Zend..
Прежде всего о том, как посмотреть результирующий запрос
1 2 3 4 5 6 7 8 9 10 11 |
/** @var \Magento\Eav\Model\Entity\Collection\AbstractCollection $collection */ $select = $collection->getSelect(); $sql = $select->__toString(); echo htmlspecialchars($sql); exit; |
далее посмотрим какие есть условия в запроса
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/** @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; |
Теперь, когда мы знаем какие части у нас доступны, мы их можем заменить таким образом, чтобы наш запрос не поломался. А затем собрать его обратно. Например, вот так
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
/** @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 можно так
1 2 3 4 |
$сollection->getSelect()->reset(\Zend_Db_Select::WHERE); $сollection->addAttributeToFilter('product_id', $productId); |
Author: | Tags: /
| Rating:
Leave a Reply