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

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

3
Magento 1:エンティティを削除するためのパフォーマンス最適化
現在、パフォーマンスに関していくつかのモジュールを改善しようとしています。 コレクションでのメソッドの使用法を知っている方もいるかもしれません。これは、製品を直接ループするのを回避するのに非常に役立ちます。walk() さらに、@ Vinaiのおかげで、コレクションdelete()メソッドを使用することもできます。 しかし、Magento 1のネイティブファイルは、これらの方法のいずれかを使用して削除するとは限らないことに気づきました。 私が見てきた最悪のコードの一つがあるmassDelete()からメソッドapp/code/core/Mage/Adminhtml/controllers/Catalog/ProductController.phpどこの製品は、削除前のループでロードされます。 foreach ($productIds as $productId) { $product = Mage::getSingleton('catalog/product')->load($productId); Mage::dispatchEvent('catalog_controller_product_delete', array('product' => $product)); $product->delete(); } そこで、パフォーマンステストをいくつか行い、ロギングの呼び出しをいくつか追加して、100製品の削除にかかった時間とメモリ使用量を確認しました。 テスト1:walkメソッド 上記に貼り付けた元のコードを次のコードに置き換えました。 $collection = Mage::getResourceModel('catalog/product_collection') ->addAttributeToSelect('entity_id') ->addIdFilter($productIds) ->walk('delete'); そして私の結果は私のくだらない開発サーバーで次のとおりです(10回のテストに基づく平均): 元のコード:19.97秒、15.84MB使用 カスタムコード:17.12秒、15.45MB使用 したがって、100個の製品を削除すると、私のカスタムコードは3秒速くなり、使用するメモリは0.4MB少なくなります。 テスト2:コレクションdelete()メソッドの使用 元のコードを次のコードに置き換えました: $collection = Mage::getResourceModel('catalog/product_collection') ->addAttributeToSelect('entity_id') ->addIdFilter($productIds) ->delete(); そしてここで吹き飛ばされた心は結果です: 元のコード:19.97秒、15.84MB使用 カスタムコード:1.24秒、6.34MB使用 したがって、100個の製品を削除すると、私のカスタムコードは18秒速くなり、使用するメモリは9MB少なくなります。 コメントで述べたように、このメソッドはMagentoイベント(ロード後、削除後)も、インデックス/キャッシュフラッシュもトリガーしないようです。 質問 だから私の質問は:Magentoコアチームがループで製品をロードするのではなくwalk('delete')、コレクションdelete()メソッドを使用しない理由がありますか? 主な目標は、モジュール開発の場合は、そのようなキーポイントに注意することがある:1を使用することはできませんいずれかの特定の例があるwalk/収集delete()方法は? …

2
Magento 2:複数のカテゴリで製品コレクションをフィルタリングする(Magento 2.1)
Magento 2.1.0を使用していますが、現在、複数のカテゴリで製品コレクションをフィルタリングするのが困難です。私はそれを機能させるために2つ以上の方法を使用しましたが、機能しません。 仮定: $catalog_ids = [618, 619, 620]; NULLを返します $productCollection = $this->productCollectionFactory->create() ->addAttributeToSelect('*') ->addCategoriesFilter(array('in' => $catalog_ids)); 例外を返します:無効な属性名:category_id $productCollection = $this->productCollectionFactory->create() ->addAttributeToSelect('*') ->addAttributeToFilter('category_id', array( 'finset' => $catalog_ids )); 構文エラーまたはアクセス違反を返します $productCollection = $this->productCollectionFactory->create() ->addAttributeToSelect('*') ->addAttributeToFilter('category_ids', array( 'finset' => $catalog_ids )); この作品を作成したり、この作品にリンクを張ったりする方法についてアドバイスはありますか?

2
子商品属性で商品コレクションをフィルター
子商品に割り当てられている2つの属性のような状況があります 1)person_height_from及び2)person_height_to有するドロップダウン・タイプ属性を 子商品にのみ割り当てられ、親商品には割り当てられません。 この属性でカテゴリページの製品コレクションをフィルタリングしたい お気に入り length = 175 $collection->addAttributeToFilter('person_height_from', array('lteq' => $length)); $collection->addAttributeToFilter('person_height_to', array('gteq' => $length)); これは、子商品が上記の値を割り当てるカテゴリページの親商品のみを取得することは可能ですか? あなたの助けが高く評価されます


1
addFieldToSelectに対するaddExpressionFieldToSelectの使用は何ですか?
私はMagentoを勉強していますが、addExpressionFieldToSelectover の使い方がよくわかりませんaddFieldToSelect。私は私の読書のどこにも答えを見つけていません。私の知る限り、フィールド名を書き換えているようですが、書き換えで配列を渡した場合のみです。フィールドをどのように書き換える必要があるかわかっているのに、なぜ最初からaddFieldToSelectでこれを実行できないのでしょうか。

2
作成時間(今日、昨日、週、時間など)によるMagentoフィルターコレクション
作成日と「昨日」作成されたhetエントリでフィルタリングするカスタムコレクションがあります。 コレクションエントリ //dates are set in controller using setCreatedTime(Mage::getModel('core/date')->gmtDate()); 昨日作成(機能しません) //3 products items Yesterday //below filtering outputs incorrect entries $collection = Mage::getModel('things/things')->getCollection(); 試しましたが、正しくないエントリが出力されます。 //thought strtotime('yesterday') would work.. $collection->addFieldToFilter('created_time', array('gt' => Mage::getModel('core/date')->date('Y-m-d H:i:s', strtotime('yesterday')))); $collection->addFieldToFilter('created_time', array('gt' => Mage::getModel('core/date')->date('Y-m-d H:i:s', strtotime('-1 day')))); $collection->addFieldToFilter('created_time', array('from'=> strtotime('-1 day', time()),'to'=> time(),'datetime' => true)); $fromDate = …

1
Magento2にカスタム属性が存在するかどうかを確認する最良の方法は何ですか
注意して、何らかの方法でそれを利用しようとする前に、カスタム属性が存在するかどうかを確認したいと思います。製品コレクションだけでなく、すべての属性コレクションに対してチェックする必要があります。私の属性は、顧客、製品、または自分で作成したカスタムモデルに存在する場合があります。 magento 1.xでは、以下を使用します。 $attr = Mage::getResourceModel('eav/entity_attribute_collection')->setCodeFilter('specialty')->getFirstItem(); if ($attr->getAttributeId() > 0) { Do some stuff....' このようなことを明示的に行うものは何も見つかりません

2
製品コレクションの問題-価格データが正しくないか、在庫切れのアイテムが表示されない
現在のカテゴリに基づいて製品コレクションを取得しています。このコレクションには在庫のある商品と在庫のない商品の両方を含める必要があり、価格設定データを正しく表示する必要もあります。 私のストアは、製品の価格を税込みで格納するように構成されており、ストアフロントで価格を包括的および排他的の両方で表示します。 コレクションを取得するためのコードは次のとおりです。 $category = Mage::registry('current_category'); $_productCollection = Mage::getModel('catalog/product')->getCollection() ->addCategoryFilter($category) ->addAttributeToSelect(['sku', 'name', 'price']) ->addAttributeToFilter('status', 1) ->addAttributeToSort('jump_number', Varien_Data_Collection::SORT_ORDER_ASC); 上記の問題は、getPriceHtml()メソッドを使用して価格ブロックをロードすると、包括価格と排他価格の両方が包括価格として表示されることです。 調査の結果、addFinalPrice()コレクションにメソッドを追加すると、予想される価格設定(正しい独占価格と正しい包括価格)が得られることがわかりました。 ただし、このaddFinalPrice()方法を含めると、私のコレクションに在庫切れの商品が含まれなくなります。 正しい価格データを返し、コレクションに販売可能な商品と在庫切れの商品の両方を含める方法はありますか?

4
在庫切れ商品の商品コレクションを取得する方法-addInStockFilterToCollection()の反対?
カテゴリーの製品を2つのリストに表示する必要があります。1つは在庫ありアイテム、もう1つは在庫なしアイテムです。 私は使っています Mage::getSingleton('cataloginventory/stock')->addInStockFilterToCollection() 在庫のあるアイテムの製品コレクションをフィルター処理しますが、在庫のないアイテムをフィルター処理する同等の方法がないようMage_CatalogInventory_Model_Stockです。前述のメソッドが定義されているモデルを確認しました。 在庫切れの商品を取得する次の例を見ました。 $collection->joinField( 'is_in_stock', 'cataloginventory/stock_item', 'is_in_stock', 'product_id=entity_id', '{{table}}.stock_id=1', 'left' ) ->addAttributeToFilter('is_in_stock', array('eq' => 0)); ...しかし、これはこれを達成するための唯一の方法または最良の方法ではありませんか?

4
シンプルな製品コレクションを読み込む(在庫ありと在庫なしの両方)
構成可能な製品のすべての「子」製品をコレクションにロードするときに問題が発生しました。 このような製品をロードするように: $simpleCollection = $configurable->getUsedProductCollection() ->addAttributeToSelect('*') ->addFilterByRequiredOptions(); foreach ($simpleCollection as $simple) { //$simple->getName(); } 在庫切れの子商品は無視されます。おそらくそれらは価格表にリストされていないため、結合されています。 getChildrenIdsによってすべての子IDをロードせずに、各単純な製品をloadでロードする別のオプションはありますか?

2
コレクションでグループ句を使用するとグリッドのページネーションが機能しない
私は製品グリッドで作業していますが、ページ付けまたは製品数が機能していません(間違った数が表示されているため)。私のブロックの_preparecollection関数は次のとおりです。コレクションにカテゴリフィルターコードを追加したので、同じidが既に存在する場合のエラーを防ぐためにグループ句を使用する必要があります。 protected function _prepareCollection() { $store = $this->_getStore(); $collection = Mage::getModel('catalog/product')->getCollection() ->addAttributeToSelect('sku') ->addAttributeToSelect('name') ->addAttributeToSelect('attribute_set_id') ->addAttributeToSelect('type_id') ->joinField('category_id', 'catalog/category_product', 'category_id', 'product_id=entity_id', null, 'left'); $collection->addAttributeToFilter('category_id', array('in' => array(4,10))) ->distinct(true); $collection->getSelect()->group('e.entity_id'); if (Mage::helper('catalog')->isModuleEnabled('Mage_CatalogInventory')) { $collection->joinField('qty', 'cataloginventory/stock_item', 'qty', 'product_id=entity_id', '{{table}}.stock_id=1', 'left'); } $collection->joinField('position', 'catalog/category_product', 'position', 'product_id=entity_id', null, 'left'); $collection->joinField('websites', 'catalog/product_website', 'website_id', 'product_id=entity_id', null, 'left'); if …

1
すべてのユーザーを一覧表示する方法
演習の一部として、データベースからのすべてのユーザーのメールを1つのページにリストしようとしています。これまでのところ、私が持っている最も近いものは $user = mage::getModel('customer/customer')->getCollection()->getData(); 戻り値 array 0 => array 'entity_id' => string '1' (length=1) 'entity_type_id' => string '1' (length=1) 'attribute_set_id' => string '0' (length=1) 'website_id' => string '1' (length=1) 'email' => string 'john.doe@example.com' (length=20) 'group_id' => string '1' (length=1) 'increment_id' => string '000000001' (length=9) 'store_id' => string '1' (length=1) 'created_at' …


3
製品コレクションにフラットテーブルの代わりにEAVを使用させる
Magento 2でフラットカタログを一時的に無効にするにはどうすればよいですか?フロントエンドストアに関連付けられた製品コレクションがあり、EAVテーブルを介してそれをロードしたいと考えています。 コレクションがフラットテーブルを使用する必要があるかどうかをどのように判断するかを調べましたが、設定をどこにでも挿入する方法が見つかりませんでした。 Magento 1では、「フラットカタログが有効」の場合、読み込まれた構成値を変更していました。 Mage::app()->getStore($storeId)->setConfig('catalog/frontend/flat_catalog_product', 0); このようなグローバルな状態に頼る必要がありますか?もしそうなら、どうですか?それとももっとエレガントな方法がありますか?

3
コレクションを再読み込み
Magento 2でコレクションをリロードする機会はありますか? 例えば: foreach($items as $singleItems){ $collection = $this->_myCollection->addFieldToFilter('filed', $singleItems->something); ... } イテレーションごとに、コレクションをクリアしてもう一度ロードする必要があります。

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