Я столкнулся с интересной проблемой в магазине Magento, который занимается в основном продажей настраиваемых продуктов. У меня есть некоторый код, который упаковывает информацию о заказе и отправляет ее на внешний склад, который затем выполняет заказ. В этом запросе я использую increment_id
в качестве идентификатора. Периодически мы спрашиваем склад, отправлен ли заказ, и если они сообщают, что он поступил, мы получаем заказ в Magento через increment_id
и выполняем заказ, создавая новый заказ на него.
Теперь это работает нормально, пока заказ не отредактирован. В связи с обработкой настраиваемых продуктов в Magento редактирование заказа включает в себя отмену текущего заказа и повторное создание его с тем же increment_id
. Впоследствии мои взаимодействия, основанные на increment_id
, теперь очищаются, поскольку при выполнении чего-либо подобного извлекается только первый (отмененный) порядок, поскольку increment_id
больше не уникален:
<?php
$order = Mage::getModel('sales/order')->loadByIncrementId(100000001);
?>
Обычно наличие дубликата increment_id
невозможно, поэтому я ожидал бы, что Magento отдаст предпочтение «активному» порядку, но это не так.
Теперь я нашел способ обойти это с помощью коллекции:
<?php
$orders = Mage::getModel('sales/order')
->getCollection()
->addAttributeToFilter('state', array('neq' => Mage_Sales_Model_Order::STATE_CANCELED))
->addAttributeToFilter('increment_id', 100000001);
foreach ($orders as $order) {
// Do what we need with the order
}
?>
Однако мне было бы интересно узнать, есть ли способ получить только одну запись из коллекции, отрицающую необходимость foreach
. Можно ли это сделать?