एक 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.