ฉันจะรับรายการผลิตภัณฑ์ทั้งหมดใน Magento 2 ได้อย่างไร
ฉันจะรับรายการผลิตภัณฑ์ทั้งหมดใน Magento 2 ได้อย่างไร
คำตอบ:
คุณควรใช้Magento\Catalog\Model\ProductRepository
หรือMagento\Catalog\Model\ResourceModel\Product\Collection
ตามความต้องการของคุณ คุณสามารถใช้ทั้งสองวิธีเพื่อรับอินสแตนซ์ของผลิตภัณฑ์พร้อมข้อมูลทั้งหมด
/**
* @param \Magento\Catalog\Model\ProductRepository $productRepository
* @param \Magento\Framework\Api\SearchCriteriaInterface $criteria
* @param \Magento\Framework\Api\Search\FilterGroup $filterGroup
* @param \Magento\Framework\Api\FilterBuilder $filterBuilder
* @param \Magento\Catalog\Model\Product\Attribute\Source\Status $productStatus
* @param \Magento\Catalog\Model\Product\Visibility $productVisibility
*/
public function __construct(
\Magento\Catalog\Model\ProductRepository $productRepository,
\Magento\Framework\Api\SearchCriteriaInterface $criteria,
\Magento\Framework\Api\Search\FilterGroup $filterGroup,
\Magento\Framework\Api\FilterBuilder $filterBuilder,
\Magento\Catalog\Model\Product\Attribute\Source\Status $productStatus,
\Magento\Catalog\Model\Product\Visibility $productVisibility
) {
$this->productRepository = $productRepository;
$this->searchCriteria = $criteria;
$this->filterGroup = $filterGroup;
$this->filterBuilder = $filterBuilder;
$this->productStatus = $productStatus;
$this->productVisibility = $productVisibility;
$this->getProductData();
}
/**
* @return \Magento\Cms\Model\Block|null
* @throws \Magento\Framework\Exception\NoSuchEntityException
*/
protected function getProductData()
{
$this->filterGroup->setFilters([
$this->filterBuilder
->setField('status')
->setConditionType('in')
->setValue($this->productStatus->getVisibleStatusIds())
->create(),
$this->filterBuilder
->setField('visibility')
->setConditionType('in')
->setValue($this->productVisibility->getVisibleInSiteIds())
->create(),
]);
$this->searchCriteria->setFilterGroups([$this->filterGroup]);
$products = $this->productRepository->getList($this->searchCriteria);
$productItems = $products->getItems();
return $productItems;
}
ผลลัพธ์:
/**
* @param \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory
* @param \Magento\Catalog\Model\Product\Attribute\Source\Status $productStatus
* @param \Magento\Catalog\Model\Product\Visibility $productVisibility
* @throws \Magento\Framework\Exception\LocalizedException
*/
public function __construct(
\Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory,
\Magento\Catalog\Model\Product\Attribute\Source\Status $productStatus,
\Magento\Catalog\Model\Product\Visibility $productVisibility
) {
$this->productCollectionFactory = $productCollectionFactory;
$this->productStatus = $productStatus;
$this->productVisibility = $productVisibility;
}
/**
* @return \Magento\Framework\DataObject[]
* @throws \Magento\Framework\Exception\LocalizedException
*/
public function getProducts()
{
/** @var \Magento\Catalog\Model\ResourceModel\Product\Collection $collection */
$collection = $this->productCollectionFactory->create();
$collection->joinAttribute('status', 'catalog_product/status', 'entity_id', null, 'inner');
$collection->joinAttribute('visibility', 'catalog_product/visibility', 'entity_id', null, 'inner');
$collection->addAttributeToFilter('status', ['in' => $this->productStatus->getVisibleStatusIds()])
->addAttributeToFilter('visibility', ['in' => $this->productVisibility->getVisibleInSiteIds()]);
return $collection->getItems();
}
ผลลัพธ์:
การใช้การเรียกใช้ REST API:
https://{host}/rest/V1/products/?searchCriteria=
ดึงผลิตภัณฑ์ทั้งหมด "searchCriteria" เป็นพารามิเตอร์ที่จำเป็น แต่สามารถเว้นว่างไว้ด้านบนได้
คำตอบที่ upvoted ที่สุดใช้งานได้ แต่ฉันต้องการพูดถึงว่าที่นี่โดยการฉีดการใช้พื้นที่เก็บข้อมูลผลิตภัณฑ์โดยตรงจะทำให้เกิดการละเมิดหลักการสัญญาบริการและนั่นคือสิ่งที่วีโอไอพีต้องการให้นักพัฒนาแก้ไข คุณควรฉีดแทนของการดำเนินงานของมันซึ่งเป็น\Magento\Catalog\Api\ProductRepositoryInterface $productRepository
\Magento\Catalog\Model\ProductRepository $productRepository
ด้วยวิธีนี้คุณจะมีพื้นที่สำหรับความสามารถในการอัพเกรดในอนาคต บรรทัดล่างคือการใช้สัญญาบริการให้ได้มากที่สุด
คุณสามารถทำได้ผ่านคำขอ API ลองดูค่าเริ่มต้น m2 api
คิดว่าการถ่ายที่ดีกว่าของคุณคือ catalogProductRepositoryV1