Question

Here is my code, where I'm calling Quote model file and getItemById function.

 public function __construct(
        \Magento\Quote\Model\Quote $quote
    ) {
        $this->quote = $quote;
    }

$itemId = "Quote Item ID";
$data = $this->quote->getItemById($itemId);

Above code returns FALSE - even there are 65 Quote Items are exists!


So I checked the Magento core method of getItemById in -

/vendor/magento/module-quote/Model/Quote.php

     /**
     * Retrieve item model object by item identifier
     *
     * @param   int $itemId
     * @return  \Magento\Quote\Model\Quote\Item|false
     */
    public function getItemById($itemId)
    {
        foreach ($this->getItemsCollection() as $item) {
            if ($item->getId() == $itemId) {
                return $item;
            }
        }

        return false;
    }

If I print the $this->getItemsCollection()->getData() then it returns the 65 Item arrays.

But As Magento passing directly the collection object $this->getItemsCollection() in foreach

So It's not going in-side the foreach loop which is expected result.

Is it a Magento bug or I am doing something wrong ?


Edited

Issue is still open for Magento Quote model file.

/vendor/magento/module-quote/Model/Quote.php

As Rohan Hapani's answer we're getting data from \Magento\Quote\Model\Quote\Item As for now.

But Magento's get getItemById still needs to be fixed.

/vendor/magento/module-quote/Model/Quote.php

/**
 * Retrieve item model object by item identifier
 *
 * @param   int $itemId
 * @return  \Magento\Quote\Model\Quote\Item|false
 */
public function getItemById($itemId)
{
    foreach ($this->getItemsCollection() as $item) {
        if ($item->getId() == $itemId) {
            return $item;
        }
    }

    return false;
}

So open for the solutions :)

Was it helpful?

Solution

Try to use this below code :

/**
 * @var \Magento\Quote\Model\Quote\Item
 */
protected $_itemModel;

public function __construct(
    .........
    \Magento\Quote\Model\Quote\Item $itemModel
    .........
)
{
    .........
    $this->_itemModel = $itemModel;
    .........
}

public function yourFunction()
{
    $itemId = "Quote Item ID";
    $this->_itemModel->load($itemId);
}

OTHER TIPS

Instead of injecting \Magento\Quote\Model\Quote class in constructor, try injecting \Magento\Checkout\Model\Session and then

$quote = $this->_session->getQuote();

This assumes your code is working with a frontend active checkout session

Licensed under: CC-BY-SA with attribution
Not affiliated with magento.stackexchange
scroll top