коллекция с помощью addAttributeToSelect ("*") все еще не получает все данные!
Допустим, я делаю следующее:
$prod = Mage::getModel('catalog/product');
$prod->load(243);
Mage::log($prod->getStockItem()->getIsInStock());
Я получаю 1 (например, функция возвращает true)
Однако, если я сделаю это:
$productCollection = Mage::getModel('catalog/product')->getCollection()
->setPageSize($pageSize)->setCurPage($pageIndex)
->addAttributeToSelect('*')->load();
Затем я перебираю продукты и делаю
Mage::log($prod->->getStockItem()->getIsInStock());
Я всегда получаю false, даже для пункта 243, который должен возвращать true.
Почему это так? и как мне загрузить данные о товаре?
(что меня волнует, так это действительно ли товар есть на складе)
Спасибо!
4 answers
Если вы хотите, чтобы ваша коллекция включала информацию об инвентаризации, перед загрузкой коллекции необходимо установить флажок.
$productCollection->setFlag('require_stock_items', true)
Товарный запас - это другая таблица (cataloginventory_stock_item
). Попробуйте это:
$collection = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('*')
->joinField('qty', 'cataloginventory/stock_item', 'qty', 'product_id=entity_id', '{{table}}.stock_id=1', 'left')
->addAttributeToFilter(
'qty',
array("gt" => 0)
);
Обратите внимание на двойные стрелки ->->после $prod
Mage::log($prod->->getStockItem()->getIsInStock());
Вы, вероятно, думаете о том, что продукт должен быть загружен полностью, когда он является частью коллекции. Похоже, что это не так. Я думаю, что это все прослушивание и хранение данных в разных таблицах.
Таким образом, вы можете использовать предложение Ричарда, также загружающее полные элементы stock_items
$Коллекция продуктов->SetFlag("требуется_сток_элементы", true)
Или вы можете присоединиться к is_in_stock колонка для вашего продукта в коллекции
$productCollection = Mage::getModel('catalog/product')->getCollection()
->setPageSize($pageSize)->setCurPage($pageIndex)
->addAttributeToSelect('*')
->joinField(
'is_in_stock',
'cataloginventory/stock_item',
'is_in_stock',
'product_id=entity_id',
'{{table}}.stock_id=1',
'left')
->load();
Или объедините таблицу со столбцами из данных о запасах, которые вам нужны.
$productCollection = Mage::getModel('catalog/product')->getCollection()
->setPageSize($pageSize)->setCurPage($pageIndex)
->addAttributeToSelect('*')
->joinTable(
'cataloginventory/stock_item',
'product_id=entity_id',
//columns needed
array('stock_id','qty', 'min_qty', 'backorders', 'is_in_stock')
)
->load();
Если вам нужно просмотреть столбцы таблицы stock_item, выполните этот запрос в своей базе данных
use database_name;
show columns from cataloginventory_stock_item;
Несколько советов по отладке. Если вы используете ->загрузить(true) в конце коллекции, вы получите выполненный SQL-запрос.
Вы также можете распечатать все данные продукта с помощью getData()
// gets the first item of the collection and print its data
var_dump($productCollection->getFirstItem()->getData());
В вашем примере внутри итерация:
Mage::log($prod->getData());
Немного не по теме, если вы добавляете товары в предложение/корзину и получаете сообщение об ошибке ниже, вы можете воспользоваться предложением Ричарда при загрузке коллекции.
Товарная позиция для Продукта недействительна.
Попробуйте это:
$collection = Mage::getModel('catalog/product')->getCollection()
->addAttributeToSelect('*');
if($collection->getSize()) {
foreach($collection as $product) {
echo 'Product Name : '. $product->getName().'<br>';
echo 'Product Stock : '. $product->getStockItem()->getIsInStock().'<br><br>';
}
}