एक Magento के 2 ऑब्जेक्ट रिपोजिटरी को छानना


24

Magento 2 में, क्या आप उत्पाद विशेषताओं द्वारा फ़िल्टर करने के लिए उत्पाद रिपॉजिटरी का उपयोग कर सकते हैं?

Magento 2 में, आप खोज मापदंड ऑब्जेक्ट का उपयोग कर सकते हैं

\Magento\Framework\Api\SearchCriteriaInterface $searchCriteria,

और एक भंडार है

\Magento\Catalog\Api\ProductRepositoryInterface $productRepository,

वस्तुओं की एक सूची लाने के लिए

$searchCriteria->getPageSize(10);
$list = $productRepository->getList($searchCriteria);

हालाँकि, सर्चक्रिटेरिया ऑब्जेक्ट नहीं (प्रतीत होता है?) में फ़िल्टरिंग की सीधी क्षमताएं हैं। खोज मापदंड वर्ग करता है कुछ कहा filterGroups जोड़ने के लिए तरीकों

#File: lib/internal/Magento/Framework/Api/SearchCriteria.php        

public function getFilterGroups()
{
    $filterGroups = $this->_get(self::FILTER_GROUPS);
    return is_array($filterGroups) ? $filterGroups : [];
}

public function setFilterGroups(array $filterGroups = null)
{
    return $this->setData(self::FILTER_GROUPS, $filterGroups);
}    

लेकिन यह स्पष्ट नहीं है कि वास्तव में, एक फ़िल्टर समूह PHP के अनपेक्षित सरणियों के लिए धन्यवाद है।

मैं चीजों को करने के लिए मैगेंटो 2 रिपॉजिटरी का उपयोग कैसे कर सकता हूं

  • [इस विशिष्ट SKU] के साथ मुझे सभी उत्पाद दिखाएं
  • [इस तिथि] के बाद बनाए गए सभी उत्पादों को मुझे दिखाएं
  • आदि।

2
ऐसा लगता है कि समूह मैगेंटो \ फ्रेमवर्क \ एपि \ सर्च \ फिल्टरग्रुप का एक सरणी है, जिसके बदले में \ Magento \ Framework \ Api \ Filter फिल्टर है, फिल्टर \ Magento \ फ्रेमवर्क \ Api \ FilterBuilder और condition_type के साथ बनाया जा सकता है 'eq', 'neq', 'gt' इत्यादि के रूप में लेकिन समर्थित स्थिति प्रकारों की सूची नहीं मिल सकी: \
— Petar Dzhambazov

2
दरअसल,
— मैगेंटो

जवाबों:


30

निम्नलिखित नमूना वर्ग की जाँच करें। SKU द्वारा फ़िल्टर करने के लिए, इसे आज़माएँ:

$productFilterDemo->getProducts('sku', 'product_sku_value', 'eq');

उत्पादों को विशिष्ट तिथि के बाद बनाने के लिए, यह:

$productFilterDemo->getProducts('created_at', 'creation date', 'gt');

नमूना वर्ग:

<?php
namespace Vendor\ModlueName\Model;

use Magento\Framework\Api\SearchCriteriaBuilder;
use Magento\Catalog\Api\ProductRepositoryInterface;

class ProductFilterDemo
{
    /** @var ProductRepositoryInterface */
    protected $productRepository;

    /** @var SearchCriteriaBuilder */
    protected $searchCriteriaBuilder;

    /**
     * Initialize dependencies.
     *
     * @param ProductRepositoryInterface $productRepository
     * @param SearchCriteriaBuilder $searchCriteriaBuilder
     */
    public function __construct(
        ProductRepositoryInterface $productRepository,
        SearchCriteriaBuilder $searchCriteriaBuilder
    ) {
        $this->productRepository = $productRepository;
        $this->searchCriteriaBuilder = $searchCriteriaBuilder;
    }

    /**
     * Get products with filter.
     * 
     * @param string $fieldName
     * @param string $fieldValue
     * @param string $filterType
     * @return \Magento\Catalog\Api\Data\ProductInterface[]
     */
    public function getProducts($fieldName, $fieldValue, $filterType)
    {
        $searchCriteria = $this->searchCriteriaBuilder->addFilter($fieldName, $fieldValue, $filterType)->create();
        $products = $this->productRepository->getList($searchCriteria);
        return $products->getItems();
    }
}

4
धन्यवाद, बस मैं उसके बाद क्या था! ऐसा लगता है कि कई फिल्टर जोड़ने से "या" स्थितियां बनती हैं - क्या "और" स्थिति बनाने का कोई तरीका है?
— एलन स्टॉर्म

3
- अगर आपके पास एक पल है। क्या मैं फ़िल्टर समूह का सही उपयोग कर रहा हूँ? वे OR, magento.stackexchange.com/questions/91023/… के
— एलन स्टॉर्म

4
फिल्टर एक फिल्टर समूह के अंदर "या" के साथ संयुक्त हैं, और प्रत्येक समूह खोज मानदंडों के स्तर पर "और" के साथ संयुक्त है। पर एक नज़र डालें: \ Magento \ Framework \ Api \ SearchCriteriaBuilder :: setFilterGroups ($ समूह]] और \ Magento \ फ्रेमवर्क \ Api \ Search \ FilterGroupBuilder :: setFilters ($ फ़िल्टर [])
— एलेक्स Paliarush

मैं Magento 2.3 का उपयोग कर रहा हूं, यदि कोई आइटम "out_of_stock" है तो खोज मापदंड बिल्डर आइटम को फ़िल्टर नहीं करता है?
— ऑक्टोपस

14
public function __construct(
    ProductRepositoryInterface $productRepository,
    SearchCriteriaBuilder $searchCriteriaBuilder,
    FilterBuilder $filterBuilder,
) {
    $this->productRepository = $productRepository;
    $this->searchCriteriaBuilder = $searchCriteriaBuilder;
    $this->filterBuilder = $filterBuilder;
}

public function getProducts()
{
    $filters[] = $this->filterBuilder
        ->setField('sku')
        ->setConditionType('eq')
        ->setValue('something')
        ->create();
    $this->searchCriteriaBuilder->addFilters($filters);

    $searchCriteria = $this->searchCriteriaBuilder->create();
    $searchResults = $this->productRepository->getList($searchCriteria);
    return $searchResults->getItems();
}

1
ऐसा लगता है कि आपके उदाहरण \Magento\Framework\Api\Search\SearchCriteriaBuilderका उपयोग किया गया है (खोज-विशिष्ट एक), जबकि मैंने उपयोग किया \Magento\Framework\Api\SearchCriteriaBuilder(सभी सेवाओं के लिए सामान्य), मेरा उत्तर देखें। इसके अलावा यह फिल्टर जोड़ने का सरल तरीका प्रदान करता है, addFilter()हस्ताक्षर अलग हैं।
— एलेक्स पालीरुश

सहमत, यह एक अलग समाधान है।
— एलडीयूसन 16

Addfilter केवल 1 परम का उपयोग कर सकता है?
— एंटोनियो पेडकिनी

@LDusan, क्या आप मुझे बता सकते हैं कि मैं ऑब्जेक्टमैनेजर में "$ searchCriteriaBuilder" का उपयोग कैसे कर सकता हूं?
— सरफराज सिपाई

2
मुझे लगता है कि आपको इसे अपने वर्ग के निर्माता में जोड़ना चाहिए, आप इसके लिए ऑब्जेक्ट मैनेजर का उपयोग क्यों करना चाहेंगे?
— LDusan
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.