タグ付けされた質問 「collection」

Magentoコレクションに関する質問


3
効率的なコレクションの呼び出し、フィルタリング、読み込み
現在、foreachループ内にネストされている多くのコレクションを再利用しています。これらのことをいくつかのレベルに上げることは可能ですか?現在Imは、51k +エンティティを持つコレクションを何度もリロードすることを余儀なくされており、これにより物事が非常に遅くなります。具体的には、キットインベントリコレクション。 <?php class Codespace_Module_Helper_Item extends other_one{ function functionOne($collection){ ... $data = $collection->getData(); foreach($data as $item){ $this->_functionTwo($item); } ... } function _functionTwo($item){ $model = Mage::getModel('catalog/product'); $id = $model->getIdBySku($item['sku']); $inventoryStatus = Mage::getResourceSingleton('catalog/product')->getAttributeRawValue($id, 'product_inventory_status', 1); $invStatus = $model->getResource()->getAttribute('product_inventory_status')->getSource()->getOptionText($inventoryStatus); if ($invStatus && $id) { if ($invStatus !== 'Z') { $stockItem = Mage::getModel('cataloginventory/stock_item'); $stockItem->setData(array()); …


4
Magento-カスタム(非eav)モデル、複数フィールドによるロード
カスタムモデルとリソースモデルがあります。複数のフィールドを使用してモデルの単一インスタンスをロードしたい。 モデルには次のフィールドがあります。 id tag_name custom_name group_name idではなくtag_name、custom_name、およびgroup_nameに基づいてこのモデルをロードします。 現在、各フィールドにコレクションとaddFilterを使用しています。これは機能しますが、Magentoにこのタイプのことに対する標準的な戦略があるのではないかと思いましたか? 編集 コアmagentoはこのシナリオではコレクションを使用しないようですが、代わりにリソースモデルで直接SQLクエリを使用します。 この例は次のとおりです。 loadByAccountAndDate() に Mage_Paypal_Model_Resource_Report_Settlement コレクションがより簡潔な方法であると思われるときに、書かれるコードの量の点で、これには理由があります magentoがこのように選択する理由がわかりません
15 collection  model 

4
magento 2でコレクションmysqlクエリを印刷するにはどうすればよいですか?
そこではgetSelect()->__toString();、コレクションの印刷クエリのMagentoの1で利用可能です。以下の例のように $products = Mage::getModel(‘catalog/product’) ->addAttributeToFilter(‘status’, array(‘eq’ => 1)); echo $products->getSelect()->__toString(); magento 2で利用可能な方法はありますか?これを見つけました->printLogQuery(true);が、うまくいきません。 更新:以下はコードです。ベストセラー製品を入手しようとしています。その作業は完璧ですが、デバッグ用のクエリを出力したいです。 $this->_collection->getSelect() ->joinLeft( 'sales_order_item', 'e.entity_id = sales_order_item.product_id', array('qty_ordered'=>'SUM(sales_order_item.qty_ordered)')) ->group('e.entity_id') ->order('qty_ordered '.$this->getCurrentDirectionReverse());

5
非フラット属性による製品コレクションのフィルター
私は次のことをしています: $productCollection = Mage::getModel('catalog/product') ->getCollection(); $productCollection ->addAttributeToFilter('my_attribute', 1); my_attribute はフラットテーブルにありませんが、フラットテーブルは有効になっています。 完全なコレクションを取得し続けます。 その理由は\Mage_Catalog_Model_Resource_Product_Collection::addAttributeToSelect次のとおりです。 $columns = $this->getEntity()->getAttributeForSelect($attributeCode); いいえ$this->getEntity()は、Mage_Catalog_Model_Resource_Product_Flatフラットフィールドを取得するインスタンスです。見つからない場合は、nullを返します。 コレクションフィルターに非フラット属性を追加するクリーンな方法は何ですか? 私の場合、フラットテーブルに属性を追加することは意味がありません。

1
結合クエリでMagentoコレクションでgroup byを使用する方法
モジュールの管理グリッドでは、このコードを使用してコレクションを取得し、顧客IDでグループ化します $collection = Mage::getModel('referafriend/statistics')->getCollection(); $collection->getSelect()->group('entity_id'); $this->setCollection($collection); しかし、ここでは、それぞれに対して名前やメールなどの顧客情報のレンダラーとフィルター機能を使用する必要がありますentity_id。顧客モデルをモジュールのテーブルに参加させたい。このために私はこのコードを書きました $collection = Mage::getModel('customer/customer')->getCollection() ->addNameToSelect(); $collection->getSelect()->join(array('refer' => 'table_name'),'refer.entity_id = e.entity_id' ); $collection->getSelect()->group('entity_id'); $collection->addAttributeToSelect('*'); しかし、それは私にこのエラーを与えます SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'entity_id' in group statement is ambiguous どんな助けも大歓迎です。

2
コレクション内のMagento2 Order by句
フィルターを追加するカスタムコレクションがあります。たとえば、私はこれを持っています: $giftColletion = $this->_giftFactory->getCollection(); $giftColletion->addFieldToFilter('store_id', 1); $ giftColletionにどのフィルターを追加すれば、フィールドの位置ごとにすべてのレコードをASC順で返すことができますか?

3
カスタムページのカスタムコレクションの階層化ナビゲーション-magento2
カスタム製品コレクションのmagento2でレイヤードナビゲーションを取得する作業をしています。レイヤードナビゲーションを表示する必要があるカスタムページで既にカスタムコレクションを取得しています。この magento1ソリューションを適応させようとしましたが、遠くまで行くことはできませんでした。 どのようにmagento2でそれを達成できますか?これまでに行ったことは以下のとおりです。 カスタムページのカスタム製品リストのCatalog ListProductブロックを拡張しました。 class View extends \Magento\Catalog\Block\Product\ListProduct { public function __construct( \Magento\Catalog\Block\Product\Context $context, \Magento\Framework\Data\Helper\PostHelper $postDataHelper, \Magento\Catalog\Model\Layer\Resolver $layerResolver, CategoryRepositoryInterface $categoryRepository, \Magento\Framework\Url\Helper\Data $urlHelper, array $data = [], \Custom\LayerNavigation\Model\Layer $testlayerobj ) { parent::__construct($context,$postDataHelper,$layerResolver, $categoryRepository,$urlHelper,$data); $this->_coreRegistry = $context->getRegistry(); $this->_testlayer = $testlayerobj; } protected function _getProductCollection() { if ($this->_productCollection === null) { $this->_productCollection …

1
製品コレクションのカスタムソート順を指定する方法
製品IDの配列に基づいて製品コレクションを作成し、ID配列に基づいてコレクションを並べ替えようとしています。 $productIds = array(318,310,311); $collection = Mage::getModel('catalog/product') ->getCollection() ->setOrder('entity_id', 'asc') // This will not do the job ->addAttributeToSelect('*') ->addAttributeToFilter('status', 1) ->addAttributeToFilter('entity_id', array( 'in' => $productIds, )); $productIds配列に表示されるように収集されたものをソートしたいのですが318, 310, 311、上記のコードはのようなコレクションソートを返します310,311, 312。 以下に示すように、プレーンMySQLクエリを使用せずにこれは可能ですか? SELECT * FROM catalog_product_entity WHERE entity_id IN (318, 310, 311) ORDER BY FIELD(entity_id, 318, 310, 311);

2
Magentoでコレクションを複製する方法は?
このコレクションに対して2つの異なる操作を実行するメソッドに1つのコレクションがあります。そのため、同じコレクションの2つの別々のコピーが必要になり、2つのコレクションの1つを元のコレクションに再度割り当てて返します。 これを簡単にするために、というオブジェクトコレクションがあるとし$collectionます。 今、組み込みのMagentoコレクションのクローンがあるかどうかわからないので、PHPクローンで試しています。 $coll1 = clone $collection; $coll2 = clone $collection; 今、私は元のコレクションのこれらの2つの別々のクローンで異なる操作を実行しようとしています。 $coll1->getSelect()->where('some where condition'); $coll2->getSelect()->where('some different where condition'); if($coll1->count() == 0) { $collection = $coll2; } else { $collection = $coll1; } しかし、奇妙なことに、これらのクローン化されたコレクションには、where条件が割り当てられています!$ coll1の条件は、$ coll2の条件とともに$ coll2に適用され、その逆も同様です。 誰もこれを達成する方法を知っていますか? ありがとう!
12 collection 

4
Magento2のグリッドにデフォルトのフィルターを追加するには?
管理グリッドにタイトルとステータスフィールド属性を持つ1つのカスタムモジュールを作成しました。 module_test_grid_block.xmlのグリッドコレクション <arguments> <argument name="id" xsi:type="string">testGrid</argument> <argument name="dataSource" xsi:type="object">Namespace\Module\Model\ResourceModel\test\Collection</argument> <argument name="default_sort" xsi:type="string">id</argument> <argument name="default_dir" xsi:type="string">desc</argument> <argument name="grid_url" xsi:type="url" path="*/*/grid"><param name="_current">1</param></argument> </arguments> 有効なデータを表示したい。管理グリッドコレクションにデフォルトフィルターを追加するオプションはありますか? 編集 <block class="Namespace\Module\Block\Adminhtml\Test\Grid" name="namespace_module_test.grid" as="grid"> <arguments> <argument name="id" xsi:type="string">testGrid</argument> <argument name="dataSource" xsi:type="object">Namespace\Module\Model\ResourceModel\test\Collection</argument> <argument name="default_sort" xsi:type="string">id</argument> <argument name="default_dir" xsi:type="string">desc</argument> <argument name="grid_url" xsi:type="url" path="*/*/grid"><param name="_current">1</param></argument> <argument name="default_filter" xsi:type="array"> <item name="status" …

4
Magento 2:ストアIDで商品コレクションをフィルタリングする方法
製品ファクトリオブジェクトを使用して、製品を作成し、製品コレクションを取得して、そのコレクションの最初のアイテムを取得できます。 /* var $productFactory \Magento\Catalog\Model\ProductFactory */ $product = $this->productFactory->create()->getCollection()->getFirstItem(); ただし、store_idをコレクションのフィルターに追加しようとした場合 $product = $this->productFactory ->create() ->getCollection() ->addFieldToFilter('store_id', 1) ->getFirstItem(); 次のエラーが表示されます Invalid attribute name: store_id #0 /Users/alanstorm/Sites/magento-2-dev-docs.dev/magento2/app/code/Magento/Eav/Model/Entity/Collection/AbstractCollection.php(1434): Magento\Eav\Model\Entity\Collection\AbstractCollection->_addAttributeJoin('store_id', 'inner') #1 /Users/alanstorm/Sites/magento-2-dev-docs.dev/magento2/app/code/Magento/Eav/Model/Entity/Collection/AbstractCollection.php(359): Magento\Eav\Model\Entity\Collection\AbstractCollection->_getAttributeConditionSql('store_id', 1, 'inner') #2 /Users/alanstorm/Sites/magento-2-dev-docs.dev/magento2/app/code/Magento/Catalog/Model/Resource/Product/Collection.php(1489): Magento\Eav\Model\Entity\Collection\AbstractCollection->addAttributeToFilter('store_id', 1, 'inner') #3 /Users/alanstorm/Sites/magento-2-dev-docs.dev/magento2/app/code/Magento/Eav/Model/Entity/Collection/AbstractCollection.php(382): Magento\Catalog\Model\Resource\Product\Collection->addAttributeToFilter('store_id', 1) ... #63 {main} store_idでフィルター処理するために製品リポジトリーを使用しようとすると、同じことが起こります(リポジトリーは内部でコレクションを使用します)。 これはバグですか?または、Magento 2でストア、Webサイト、および製品間の関係が変更され、これが正当なクエリではなくなったのですか?どちらも?どちらでもない?他に何か?

5
Magento-コレクションの順序を設定できません
これは正しく注文されていないようです、何か間違っているのですか?提案? $componentQuantityCollection = Mage::getModel('catalog/product')->getCollection(); $componentQuantityCollection->joinField('qty', 'cataloginventory/stock_item', 'qty', 'product_id=entity_id', '{{table}}.stock_id=1', 'left'); $componentQuantityCollection->addAttributeToFilter('sku', array('in' => $componentSkus))->setOrder('sku','ASC'); ソートされていないようで、最初のものとは異なる別のコレクション: $kitCollection = Mage::getModel('kitinventory/kitinventory')->getCollection()->addFieldToFilter('kit_sku', $sku)->setOrder('related_sku', 'DESC');

4
製品属性を結合するためのベストプラクティス
製品リファレンスを含むカスタムテーブルがありますproduct_id。次に、バックエンドグリッドに製品情報(SKU、名前)を表示したいのですが、これを行うためのベストプラクティスが何なのかわかりません。 SKU次のように私の推測は次のとおりです。 $collection->join( 'catalog/product', 'product_id=`catalog/product`.entity_id', array('product_sku' => 'sku') ) ( 私のグリッドブロッククラスのメソッドからのコード_prepareCollection() ) しかし、製品名はどうですか?これは、catalog_product_entity_varcharにあります。私の理解では、独自のリソースモデルとコレクションがベースになってMage_Eav_Model_Entity_Collection_Abstractいる場合は、のようなメソッドを使用できるため、簡単に入手できますjoinAttribute。しかし、私のモデルは単純なテーブルに基づいており、そこから拡張されてMage_Core_Model_Resource_Db_Collection_Abstractおり、joinAttribute利用できる方法はありません。 この場合、製品名を取得する最良の方法は何ですか? あなたの時間と助けをありがとう:-) 更新: より正確には、リソースモデルとコレクションについて話していました。次のようないくつかの属性を持つ単純なフラットテーブルと一致します。 entity_id product_id created_at user_id 私の意図は、いくつかの統計を表示するバックエンドにグリッドを配置することです。 ProductSku Count(ProductSku) MAX(created_at) 私の知る限り、これを行うための最善の方法は、グリッドブロッククラスを使用することであり、実行するメソッドは_prepareCollection()です。 私の方法は次のようになります: protected function _prepareCollection() { // Get and set our collection for the grid $collection = Mage::getResourceModel($this->_getCollectionClass()); $collection ->join( 'catalog/product', 'product_id=`catalog/product`.entity_id', array('product_sku' => 'sku') …

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.