Получение одного заказа в Magento по increment_id после редактирования заказа с настраиваемыми продуктами - PullRequest
6 голосов
/ 28 апреля 2011

Я столкнулся с интересной проблемой в магазине 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. Можно ли это сделать?

Ответы [ 3 ]

9 голосов
/ 28 апреля 2011

Использование getFirstItem ()

$orders = Mage::getModel('sales/order')
  ->getCollection()
  ->addAttributeToFilter('state', array('neq' => Mage_Sales_Model_Order::STATE_CANCELED))
  ->addAttributeToFilter('increment_id', 100000001)
  ->getFirstItem();
6 голосов
/ 21 августа 2014
$order = Mage::getModel('sales/order')->loadByIncrementId($orderId);
1 голос
/ 05 ноября 2014

Хотя технически ответ Mukesh будет работать, если у вас есть большой набор данных, возвращаемый запросом, он потенциально истечет время ожидания при загрузке всей коллекции, что и происходит в самой первой строке функции getFirstItem (). Это изложено здесь: 3 главные причины, по которым следует избегать getFirstItem ()

от Magento
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...