如何在magento 2中按SKU加载产品


29

这是非常基本的,但是我在Stackexchange或google上找不到有效的示例。我想从助手或块中加载产品。我已经尝试过一些事情,例如:

$objectManager = \Magento\Framework\App\ObjectManager::getInstance(); 

$product = $objectManager->create('\Magento\Catalog\Api\Data\ProductInterface');

$product->get('<SKU>');

$product->getName();

这什么也不会返回。我也尝试加载任何可用的模型和API,但似乎与SKU无关。

Answers:


56

根据Magento 2服务合同,正确的方法是使用存储库:

$product = $this->productRepositoryInterface->get($sku);

用于Magento\Catalog\Api\ProductRepositoryInterface在构造函数中获取它。

完整示例:

...
private $productRepository; 
...
public function __construct(
    ...
    \Magento\Catalog\Api\ProductRepositoryInterface $productRepository
    ...
) {
    ...
    $this->productRepository = $productRepository;
    ...
}

public function loadMyProduct($sku)
{
    return $this->productRepository->get($sku);
}
...

注意:

如果产品不存在,则此方法将触发NoSuchEntityException错误,就像在Magento2最佳实践中那样。

因此,如果需要以某种方式处理,请将其包装在try / catch块中。


9
未找到产品时,此方法将产生错误。因此,对于检查产品是否存在,似乎@fschmengler的解决方案可能是更好的方法。
Dennis van Schaik

1
您可以添加有关的更多详细信息Use Magento\Catalog\Api\ProductRepositoryInterface to get it in your constructor.吗?我该怎么办?非常感谢
davideghz

请参阅我的最新文章
Phoenix128_RiccardoT 2016年

使用服务合同的实际正确的Magento 2方法更加复杂。Repository-> get()仍然是一个模型调用,不应使用。正确的方法是对SearchCriteriaBuilder使用repository-> getList()。看到我对订单的回答(几乎相同的方法):magento.stackexchange.com/questions/140374/…–
Jacques

1
@JaccoAmersfoort,我确认“ get”是正确的方法。在您的示例中,建议这样做是因为订单存储库中的“获取”需要“订单ID”,并且该用户正在寻找“增量ID”。在那种情况下,getList是最佳选择,但是如果可以使用“ get”,则应该使用它。
Phoenix128_RiccardoT

27

代替直接使用对象管理器,注入ProductFactory:

public function __construct(\Magento\Catalog\Model\ProductFactory $productFactory)
{
    $this->productFactory = $productFactory;
}

然后像这样使用它:

$product = $this->productFactory->create();
$product->loadByAttribute('sku', $sku);

或进行全负载(以上使用集合加载它):

$product = $this->productFactory->create();
$product->load($product->getIdBySku($sku));

7
实际上,在此仍然有效的同时,使用load()和收集是“ Magento 1”的方式,最好使用@RiccardoT建议的存储库。
Fabian Schmengler '16

1
同样,您的方法将返回一个Product 模型,而使用存储库将为您提供一个Product 数据模型Api/Data/Product),这是一个转换为简化DTO的Product模型。需要考虑的东西,因为它们完全不同。
nevvermind

@FabianSchmengler:尝试$product = $this->productFactory->create(); $product->load($product->getIdBySku($sku)); $product->getThumbnailUrl()用于显示产品缩略图,但无法正常工作。
Slimshadddyyy '18年

@FabianSchmengler是,存储库的推荐与@RiccardoT答案一样好。但是,如果我输入了错误的sku,那么它将中断整个操作并抛出异常,因此在这种情况下,我们必须依靠productFactory
Himanshu

@Himanshu捕捉到异常。而且,在这种情况下,如果您需要一个新产品实例,则仍然可以使用工厂创建它
Fabian Schmengler,

7

我喜欢@ phoenix128-riccardot的答案,但是会添加一个例外,以防万一该产品不存在:

尝试{
    $ product = $ this-> productRepositoryInterface-> get($ sku);
}捕获(\ Magento \ Framework \ Exception \ NoSuchEntityException $ e){
    //在此处插入错误处理
}

很抱歉,我无法将其添加为评论(信誉太低)。


4

你可以试试看

$objectManager = \Magento\Framework\App\ObjectManager::getInstance(); 

$productRepository = $objectManager->get('\Magento\Catalog\Model\ProductRepository');
$productObj = $productRepository->get('<SKU>');

echo $productObj->getId();

3

尝试这个:

/** @var \Magento\Catalog\Model\ProductFactory $productFactory */
$product = $productFactory->create();
$product->loadByAttribute('sku', 'my sku');

// $product->load($product->getId()); // may need to do this too,
// see \Magento\Framework\Api\AttributeValueFactory\AbstractModel::loadByAttribute

在csv导入期间,我需要从sku(csv列)获取product_id,并且仅保存product_id。如何实现?
Sushivam '16

0

使用依赖注入(DI)

这是使用依赖注入在Magento 2中按产品ID和SKU获取产品信息的示例代码。

在这种情况下,我们可能需要在模块块类的构造函数中注入\ Magento \ Catalog \ Model \ ProductRepository类的对象,然后从视图(.phtml)文件访问它。

示例文件路径:app / code / YourCompanyName / YourModuleName / Block / YourCustomBlock.php

<?php
namespace YourCompanyName\YourModuleName\Block;

class YourCustomBlock extends \Magento\Framework\View\Element\Template
{ 
    protected $_productRepository;

    public function __construct(
        \Magento\Framework\View\Element\Template\Context $context, 
        \Magento\Catalog\Model\ProductRepository $productRepository,
        array $data = []
    ) {
        $this->_productRepository = $productRepository;
        parent::__construct($context, $data);
    }

    public function getProductById($id) {
        return $this->_productRepository->getById($id);
    }

    public function getProductBySku($sku) {
        return $this->_productRepository->get($sku);
    }
}

现在,我们可以如下使用视图(.phtml)文件中的函数。

// get product by id
$product = $block->getProductById(15);

// get product by sku
$product = $block->getProductBySku('MT12');

echo $product->getEntityId() . '<br>';
echo $product->getName() . '<br>';
echo $product->getSKU() . '<br>';
echo $product->getPrice() . '<br>';
echo $product->getSpecialPrice() . '<br>';
echo $product->getTypeId() . '<br>';
echo $product->getProductUrl() . '<br>';

使用对象管理器

这是使用对象管理器在Magento 2中按产品ID和SKU获取产品信息的示例代码。

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();

$productRepository = $objectManager->get('\Magento\Catalog\Model\ProductRepository');

// get product by product id 
$product = $productRepository->getById(15);

// get product by product sku 
$product = $productRepository->get('MT12');

echo $product->getEntityId() . '<br>';
echo $product->getName() . '<br>';
echo $product->getSKU() . '<br>';
echo $product->getPrice() . '<br>';
echo $product->getSpecialPrice() . '<br>';
echo $product->getTypeId() . '<br>';
echo $product->getProductUrl() . '<br>';

-3
<?php
use Magento\Framework\App\Bootstrap;
require __DIR__ . '/app/bootstrap.php';
$bootstrap = Bootstrap::create(BP, $_SERVER);
$obj = $bootstrap->getObjectManager();
$state = $obj->get('Magento\Framework\App\State');
$state->setAreaCode('frontend');


$sku ='24-MB01';
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$productObject = $objectManager->get('Magento\Catalog\Model\Product');
$product = $productObject->loadByAttribute('sku', $sku);
echo $product->getName();

?>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.