I am able to use the addFilter
in the searchCriteriaBuilder
like this:
$this->searchCriteriaBuilder->addFilter(
'name',
'M%',
'like'
);
For example in this code I can get all the product names starting with the letter M:
<?php
namespace Unit5\Module3\Controller\Index;
use Magento\Catalog\Api\ProductRepositoryInterface;
use Magento\Framework\Api\SearchCriteriaBuilder;
class Index extends \Magento\Framework\App\Action\Action
{
/**
* @var ProductRepositoryInterface
*/
private $productRepository;
/**
* @var SearchCriteriaBuilder
*/
private $searchCriteriaBuilder;
public function __construct(
\Magento\Framework\App\Action\Context $context,
ProductRepositoryInterface $productRepository,
SearchCriteriaBuilder $searchCriteriaBuilder
) {
parent::__construct($context);
$this->productRepository = $productRepository;
$this->searchCriteriaBuilder = $searchCriteriaBuilder;
}
public function execute()
{
$this->getResponse()->setHeader('Content-Type', 'text/plain');
$products = $this->getProductsFromRepository();
foreach ($products as $product) {
$this->outputProduct($product);
}
}
/**
* @return ProductInterface[]
*/
private function getProductsFromRepository()
{
$this->searchCriteriaBuilder->addFilter(
'name',
'M%',
'like'
);
$criteria = $this->searchCriteriaBuilder->create();
$products = $this->productRepository->getList($criteria);
return $products->getItems();
}
private function outputProduct(\Magento\Catalog\Api\Data\ProductInterface $product)
{
$this->getResponse()->appendBody(sprintf(
"%s - %s (%d)\n",
$product->getName(),
$product->getSku(),
$product->getId())
);
}
}
However, I have seen in some documents the use of Magento\Framework\Api\FilterBuilder. When I use that it generates this error:
Warning: Missing argument 2 for Magento\Framework\Api\SearchCriteriaBuilder::addFilter()
This is addFilter function in Magento\Framework\Api\SearchCriteriaBuilder:
public function addFilter($field, $value, $conditionType = 'eq')
{
$this->addFilters([
$this->filterBuilder->setField($field)
->setValue($value)
->setConditionType($conditionType)
->create()
]);
return $this;
}
This is my code:
<?php
namespace Unit5\Module3\Controller\Index;
use Magento\Catalog\Api\ProductRepositoryInterface;
use Magento\Framework\Api\SearchCriteriaBuilder;
use Magento\Framework\Api\FilterBuilder;
class Index extends \Magento\Framework\App\Action\Action
{
/**
* @var ProductRepositoryInterface
*/
private $productRepository;
/**
* @var SearchCriteriaBuilder
*/
private $searchCriteriaBuilder;
/**
* @var FilterBuilder
*/
private $filterBuilder;
public function __construct(
\Magento\Framework\App\Action\Context $context,
ProductRepositoryInterface $productRepository,
SearchCriteriaBuilder $searchCriteriaBuilder,
FilterBuilder $filterBuilder
) {
parent::__construct($context);
$this->productRepository = $productRepository;
$this->searchCriteriaBuilder = $searchCriteriaBuilder;
$this->filterBuilder = $filterBuilder;
}
public function execute()
{
$this->getResponse()->setHeader('Content-Type', 'text/plain');
$products = $this->getProductsFromRepository();
foreach ($products as $product) {
$this->outputProduct($product);
}
}
/**
* @return ProductInterface[]
*/
private function getProductsFromRepository()
{
$nameFilter = $this->filterBuilder
->setField('name')
->setValue('M%')
->setConditionType('like')
->create();
$this->searchCriteriaBuilder->addFilter([$nameFilter]);
$criteria = $this->searchCriteriaBuilder->create();
$products = $this->productRepository->getList($criteria);
return $products->getItems();
}
private function outputProduct(\Magento\Catalog\Api\Data\ProductInterface $product)
{
$this->getResponse()->appendBody(sprintf(
"%s - %s (%d)\n",
$product->getName(),
$product->getSku(),
$product->getId())
);
}
}
So what is the correct way of using a FilterBuilder ?