коллекция с помощью 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.

Почему это так? и как мне загрузить данные о товаре?

(что меня волнует, так это действительно ли товар есть на складе)

Спасибо!

Author: Ronen Ness, 2016-01-07

4 answers

Если вы хотите, чтобы ваша коллекция включала информацию об инвентаризации, перед загрузкой коллекции необходимо установить флажок.

$productCollection->setFlag('require_stock_items', true)

 4
Author: Richard, 2016-01-21 13:18:25

Товарный запас - это другая таблица (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)
    );
 2
Author: Timon de Groot, 2016-01-15 19:02:14

Обратите внимание на двойные стрелки ->->после $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());

Немного не по теме, если вы добавляете товары в предложение/корзину и получаете сообщение об ошибке ниже, вы можете воспользоваться предложением Ричарда при загрузке коллекции.

Товарная позиция для Продукта недействительна.

 1
Author: Leventis123, 2016-04-27 09:58:46

Попробуйте это:

$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>';
    }           
}
 0
Author: Abdul, 2016-01-08 04:55:43