Magento 2.2.6: У меня ошибка при изменении коллекции select
Мне нужно изменить запрос заказов в сетке серверной части по представительному атрибуту (пользовательский атрибут).
Я получаю следующую ошибку :
Элемент (Magento\Framework\Представление\Элемент\UIComponent\Поставщик данных\Документ) с тем же идентификатором "2" уже существует.
Поставщик данных: (метод applydealerfilter())
class DataProviderCollectionFactory
{
/** @var mixed */
protected $_requestName;
/** @var CollectionModifier */
protected $_collectionModifier;
/** @var PermHelper */
protected $_permHelper;
/** @var DealerOrderCollectionFactory */
protected $_dealerOrderCollectionFactory;
/** @var DealerCustomerCollectionFactory */
protected $_dealerCustomerCollectionFactory;
/** @var Scope Config */
protected $_scopeConfig;
/**
* @param PermHelper $permHelper
*/
public function __construct(
CollectionModifier $collectionModifier,
PermHelper $permHelper,
DealerCustomerCollectionFactory $dealerCustomerCollectionFactory,
DealerOrderCollectionFactory $dealerOrderCollectionFactory
) {
$this->_collectionModifier = $collectionModifier;
$this->_permHelper = $permHelper;
$this->_dealerCustomerCollectionFactory = $dealerCustomerCollectionFactory;
$this->_dealerOrderCollectionFactory = $dealerOrderCollectionFactory;
}
/**
* @param CollectionFactory $collectionFactory
* @param $requestName
* @return array
*/
public function beforeGetReport(
CollectionFactory $collectionFactory,
$requestName
){
$this->_requestName = $requestName;
return [$requestName];
}
/**
* @param CollectionFactory $collectionFactory
* @param AbstractCollection $collection
* @return AbstractCollection
* @throws \Exception
*/
public function afterGetReport(
CollectionFactory $collectionFactory,
$collection
){
if ($this->_permHelper->isAllowAllCustomersAndOrders()) {
return $collection;
}
if (
($this->_collectionModifier->isOrderDataSource($this->_requestName)) &&
$this->_permHelper->isBackendDealer()
){ //if order based collections
$this->_collectionModifier->applyDealerFilter(
$this->_permHelper->getBackendDealer()->getId(),
$collection,
$this->_dealerOrderCollectionFactory,
'entity_id',
'order_id'
);
} else if (
(
$this->_collectionModifier->isInvoiceDataSource($this->_requestName) ||
$this->_collectionModifier->isShipmentDataSource($this->_requestName) ||
$this->_collectionModifier->isCreditMemoDataSource($this->_requestName)
) &&
$this->_permHelper->isBackendDealer()
) {
$this->_collectionModifier->applyDealerFilter(
$this->_permHelper->getBackendDealer()->getId(),
$collection,
$this->_dealerOrderCollectionFactory,
'order_id',
'order_id'
);
} else if (
($this->_collectionModifier->isCustomerDataSource($this->_requestName)) &&
$this->_permHelper->isBackendDealer()
){ //if customer based collections
$this->_collectionModifier->applyDealerFilter(
$this->_permHelper->getBackendDealer()->getId(),
$collection,
$this->_dealerCustomerCollectionFactory,
'entity_id',
'customer_id'
);
}
return $collection;
}
}
Где применяется фильтр с соединениями:
class CollectionModifier extends \Amasty\Perm\Helper\CollectionModifier
{
/**
* Filter collection by dealer
* @param $value
* @param AbstractCollection $collection
* @param $factory
* @param string $primaryKey
* @param string $foreignKey
* @param string $filterPostfix
* @throws \Zend_Db_Select_Exception
*/
public function applyDealerFilter(
$value,
AbstractCollection $collection,
$factory,
$primaryKey = 'entity_id',
$foreignKey = 'entity_id',
$filterPostfix = '_filter'
){
$collection->getSelect()->join(
['ce' => $collection->getTable('customer_entity')],
'ce.email = main_table.customer_email'
)->join(
['cet' => $collection->getTable('customer_entity_text')],
'cet.entity_id = ce.entity_id'
)->join(
['ea' => $collection->getTable('eav_attribute')],
'ea.attribute_id = cet.attribute_id'
)->where(
'ea.attribute_code = \'mod_dealers\''
)->where(
'cet.value like \'%' . $value . '%\''
);
/**
here I have the error ID:
Item (Magento\Framework\View\Element\UiComponent\DataProvider\Document) with the same ID "2" already exists.
*/
var_dump($collection->toArray()); die("stop");
}
}
1
1 answers
Magento не может обрабатывать более двух одинаковых полей внутри.
Решение состоит в том, чтобы сделать , где В:
$collection->getSelect()->where(
' main_table.entity_id IN (
SELECT DISTINCT
so.entity_id
FROM ' . $collection->getMainTable() . ' so
INNER JOIN customer_entity ce on ce.email = so.customer_email
INNER JOIN customer_entity_text cet on cet.entity_id = ce.entity_id
INNER JOIN eav_attribute ea on ea.attribute_id = cet.attribute_id
WHERE ea.attribute_code = \'mod_dealers\'
AND FIND_IN_SET(\'' . $value . '\', cet.value)
)'
);
3
Author: chdzma, 2018-10-05 07:48:27