Загрузка соответствующих объектов при загрузке коллекции - PullRequest
0 голосов
/ 23 сентября 2011

В настоящее время я работаю в интернет-магазине, используя модуль аукциона. Этот аукционный модуль имеет собственный набор лиц, представляющих аукцион и их заявки. Основным объектом является модель ProductAuction. Эта модель имеет отношение к модели Каталог_Продукт Magento.

Везде, где загружается коллекция, товары должны быть загружены после загрузки коллекции ProductAuctions.

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

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

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

Возможно ли в Magento загружать связанные сущности внутри коллекции, так же, как приличный ORM делал бы с отношениями One-2-One, Many-2-One и другими?

Я не нашел ни одного примера этого, но не могу представить, что это невозможно в Magento.

Спасибо за любую помощь в этом.

== РЕДАКТИРОВАТЬ ==

Небольшой пример кода, чтобы показать, что я делаю в данный момент:

/**
 * Build the correct query to load the product collection for
 * either the search result page or the catalog overview page
 */
private function buildProductCollectionQuery() {

    /**
     * @var Mage_CatalogSearch_Model_Query
     */
    $searchQuery = Mage::helper('catalogsearch')->getQuery();

    $store_id = Mage::app()->getStore()->getId();
    $productIds = Mage::helper('auction')->getProductAuctionIds($store_id);

    $IDs = array();
    $productIds = array();
    $collection = Mage::getModel('auction/productauction')
                           ->getCollection()
                           ->addFieldToFilter(
                                                'status', array('in' => array(4))
                                             );

    if (count($collection)) {
        foreach ($collection as $item) {
            $IDs[] = $item->getProductId();
        }
    }

    $collection = Mage::getResourceModel('catalog/product_collection')
                                        ->addFieldToFilter('entity_id',array('in'=> $IDs ))
                                        ->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
                                        ->addMinimalPrice()
                                        ->addTaxPercents()
                                        ->addStoreFilter();

    if( $searchQuery != null ) {
        $collection->addAttributeToFilter(array(
                                array('attribute' => 'name', 'like'=>'%' . $searchQuery->getQueryText() . '%'),
                                array('attribute' => 'description', 'like'=>'%' . $searchQuery->getQueryText() . '%')
                                    )
                                );

        // @TODO This should be done via the Request object, but the object doesn't see the cat parameter
        if( isset($_GET['cat'])  ) {
              $collection->addCategoryFilter(Mage::getModel('catalog/category')->load($_GET['cat']) );
        }
    }

    return $collection;
}

1 Ответ

0 голосов
/ 28 сентября 2011

удалось найти решение.Теперь я использую следующий код, чтобы получить всю необходимую информацию.Тем не менее, я удивлен, что так сложно создавать экземпляры связанных объектов, как это делал бы любой обычный ORM.Но, возможно, я ожидаю слишком много Magento ..

В любом случае, это код, который я использую сейчас:

/**
 * Build the correct query to load the product collection for
 * either the search result page or the catalog overview page
 */
private function buildProductCollectionQuery() {
    /**
     * @var Mage_CatalogSearch_Model_Query
     */
    $searchQuery = Mage::helper('catalogsearch')->getQuery();

    $collection = Mage::getResourceModel('catalog/product_collection')
                                        ->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
                                        ->addAttributeToSelect(array('product_id' => 'entity_id'))
                                        ->joinTable(array('productauction' => 'auction/productauction'), 'product_id=entity_id', array('start_time' => 'productauction.start_time','end_time' => 'productauction.end_time','entity_id' => 'productauction.productauction_id', 'product_id' => 'product_id'))
                                        ->joinTable(array('auction' => 'auction/auction'), 'product_id = entity_id', array('last_bid' => 'MAX(auction.price)'), 'auction.productauction_id = productauction.productauction_id', 'inner')
                                        ->addMinimalPrice()
                                        ->addTaxPercents()
                                        ->addStoreFilter()
                                        ->setPage((int) $this->getRequest()->getParam('p', 1), 1);

    $currentCategory = Mage::registry('current_category');
    if( $currentCategory != null ) {
        $collection->addCategoryFilter($currentCategory);
    }

    if( $searchQuery != null ) {
        $collection->addAttributeToFilter(array(
                                array('attribute' => 'name', 'like'=>'%' . $searchQuery->getQueryText() . '%'),
                                array('attribute' => 'description', 'like'=>'%' . $searchQuery->getQueryText() . '%')
                                    )
                                );

        // @TODO This should be done via the Request object, but the object doesn't see the cat parameter
        if( isset($_GET['cat'])  ) {
              $collection->addCategoryFilter(Mage::getModel('catalog/category')->load($_GET['cat']) );
        }
    }

    $collection->getSelect()->group('productauction.productauction_id');
    return $collection;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...