После объединения не может фильтровать по атрибуту кол-во - получение товаров из запасов, которые есть в наличии - PullRequest
1 голос
/ 08 августа 2010

В прошлом вы были настолько полезны, что я продолжаю возвращаться в поисках помощи и обучения.

На этот раз я пытаюсь получить все продукты, которые имеют количество больше 1 и которые есть в наличии (is_in_stock = 1)

    $products = Mage::getModel('catalog/product')->getCollection();    
    //$products->addAttributeToSelect('*');        

    //SELECT `e`.*, `stock`.`qty` FROM `catalog_product_entity` AS `e` LEFT JOIN `cataloginventory_stock_item` AS `stock` ON stock.product_id = e.entity_id       
    $products->getSelect()->joinLeft(      
       array('stock'=>'cataloginventory_stock_item'),     
       'stock.product_id = e.entity_id',      
       array('stock.qty', 'stock.is_in_stock')      
     );

Это возвращает qty и is_in_stock столбцы прикреплены к таблице продуктов.Вы можете проверить это следующим образом:

$products->getFirstItem()->getQty();        
$products->getFirstItem()->getIsInStock();        

Проблема начинается, когда я пытаюсь фильтровать по qty и is_in_stock.

    $products->addFieldToFilter(array(       
       array('Qty','gt'=>'0'),      
       array('Is_in_stock','eq'=>'1'),        
    ));       

Это возвращает - Invalid attribute name никогда не выполняетсяфильтрация.Я предполагаю, что он пытается найти e.qty, но не может его найти.

Итак, я попытался отфильтровать по-другому:

$products->getSelect()->where("`qty` > 0");        
$products->getSelect()->where("`is_in_stock` = 1");          

Это не фильтрация, хотя, если вы посмотрите на его SQL-запрос (var_dump((string) $products->getSelect())) и запустите этот запросв phpMyAdmin это работает.

Alan Storm в его уроке упоминает, что «Запрос к базе данных не будет выполнен, пока вы не попытаетесь получить доступ к элементу в Коллекции».Итак, я выполняю вызов $ products-> getFirstItem (), но он все еще не выполняет запрос или не выполняет фильтрацию другими словами.

Что я делаю не так?Любые идеи, как фильтровать по атрибутам, которые присоединяются к таблице?

Еще раз спасибо,

Margots

Ответы [ 2 ]

2 голосов
/ 09 августа 2010

Я бы посоветовал вам попробовать использовать $products->addAttributeToFilter... вместо $products->addFieldToFilter... - метод addField работает только тогда, когда поле находится на главной таблице, к которой вы обращаетесь (в данном случае catalog_product_entity).Поскольку поля инвентаризации находятся в объединенной таблице, вам необходимо использовать addAttribute.

Надеюсь, это поможет, JD

0 голосов
/ 22 августа 2010

Заглянув под капот, я узнал, что _selectAttributes поле экземпляра не было назначено в классе Mage_Eav_Model_Entity_Collection_Abstract, и поэтому получил исключение.Решением обычно было бы то, что Джонатан Дэй предложил выше - добавьте метод addAttributeToFilter(), однако.Он вернет ошибку, так как не может найти такой атрибут для каталога / продукта.(qty и in_invetory в cataloginventory_stock_item).Я нашел два решения моей проблемы, и оба требовали идти в другом направлении:

  1. Один из них занимался поиском способа выбора оператора Select, который я установил для сбора продукта (см. Выше), но каким-то образом это былоне сбрасывать коллекцию с новым продуктом.Когда я скопировал эту Sql-характеристику в phpMyAdmin, это сработало, поэтому как запросить этот оператор из коллекции продуктов:

     $stmt = $products->getConnection('core_write')->query($products->getSelect()->__toString());      
    
    while($rows = $stmt->fetch(PDO::FETCH_ASSOC)){    
      echo "<br>Product Id ".$rows['entity_id'];    
    }    
    
  2. Вместо использования таблицы сущностей catalog/product я использовал плоскую таблицуcataloginventory_stock_item чтобы выполнить то же самое

    $stockItem = new Mage_CatalogInventory_Model_Stock_Item();    
    $stockItems->addQtyFilter('>',0);    
    $stockItems->addFieldToFilter('is_in_stock',array('eq'=>'1'));     
    

Теперь есть коллекция всех продуктов с qty > 0, которые есть в наличии.

...