การกรองคลังเก็บวัตถุวีโอไอพี 2


24

ใน Magento 2 คุณสามารถใช้ที่เก็บผลิตภัณฑ์เพื่อกรองตามคุณสมบัติของผลิตภัณฑ์ได้หรือไม่?

ใน Magento 2 คุณสามารถใช้วัตถุเงื่อนไขการค้นหา

\Magento\Framework\Api\SearchCriteriaInterface $searchCriteria,

และพื้นที่เก็บข้อมูล

\Magento\Catalog\Api\ProductRepositoryInterface $productRepository,

เพื่อดึงรายการของวัตถุ

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

อย่างไรก็ตามวัตถุ 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

ฉันจะใช้ที่เก็บ Magento 2 เพื่อทำสิ่งต่าง ๆ ได้อย่างไร

  • แสดงผลิตภัณฑ์ทั้งหมดด้วย [SKU เฉพาะนี้]
  • แสดงผลิตภัณฑ์ทั้งหมดที่สร้างขึ้นหลังจาก [วันที่นี้]
  • เป็นต้น

2
ดูเหมือนว่ากลุ่มดังกล่าวเป็นอาร์เรย์ของ Magento \ Framework \ Api \ Search \ FilterGroup ซึ่งจะมีตัวกรอง \ Magento \ Framework \ Api \ Filter ตัวกรองสามารถสร้างได้ด้วย \ Magento \ Framework \ Api \ FilterBuilder และ condition_type อยู่ใน รูปแบบของ 'eq', 'neq', 'gt' ฯลฯ แต่ไม่พบรายการประเภทสภาพที่รองรับ: \
Petar Dzhambazov

2
ที่จริงแล้วบางอย่างเช่นรายการสามารถดูได้ที่ Magento / Framework / Api / CriteriaInterface.php: 79
Petar Dzhambazov

คำตอบ:


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
ขอบคุณสิ่งที่ฉันเป็นหลังจาก! ดูเหมือนว่าการเพิ่มตัวกรองหลายตัวจะสร้างเงื่อนไข "หรือ" - มีวิธีในการสร้างเงื่อนไข "และ" หรือไม่?
Alan Storm

3
- ถ้าคุณมีเวลา ฉันใช้กลุ่มตัวกรองถูกต้องหรือไม่ ดูเหมือนว่าพวกเขาจะใช้เป็น OR ไม่ใช่ AND AND magento.stackexchange.com/questions/91023/…
Alan Storm

4
ตัวกรองจะรวมกับ "OR" ภายในกลุ่มตัวกรองหนึ่งกลุ่มและแต่ละกลุ่มจะรวมกับ "AND" ในระดับของเกณฑ์การค้นหา ดูที่: \ Magento \ Framework \ Api \ SearchCriteriaBuilder :: setFilterGroups ($ groups []) และ \ Magento \ Framework \ Api \ Search \ FilterGroupBuilder :: setFilters ($ ตัวกรอง [])
Alex Paliarush

ฉันใช้ Magento 2.3 ตัวสร้างเกณฑ์การค้นหาไม่กรองรายการหากรายการนั้นเป็น "out_of_stock"
Octopus

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()ลายเซ็นแตกต่างกัน
Alex Paliarush

ตกลงมันเป็นทางออกที่แตกต่างกันเล็กน้อย
LDusan

addfilter สามารถใช้เพียง 1 พารามิเตอร์
Antonio Pedicini

@LDusan คุณช่วยบอกฉันได้อย่างไรว่าฉันจะใช้ "$ searchCriteriaBuilder" ใน objectmanager ได้อย่างไร
Sarfaraj Sipai

2
ฉันคิดว่าคุณควรเพิ่มเข้าไปในตัวสร้างคลาสของคุณทำไมคุณต้องการใช้ตัวจัดการวัตถุสำหรับสิ่งนั้น
LDusan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.