在Magento 2的销售订单网格中正确添加新列

问题描述

我创建了一个模块,在销售网格中添加2列,shipping_information和跟踪号。 这些列会出现,但是当我尝试在管理订单页面(例如973)中按订单ID进行过滤时,出现此错误

main.CRITICAL: Item (Magento\Framework\View\Element\UiComponent\DataProvider\Document\Interceptor) with the same ID "6245" already exists. {"exception":"[object] (Exception(code: 0): Item (Magento\\Framework\\View\\Element\\UiComponent\\DataProvider\\Document\\Interceptor) with the same ID \"6245\" already exists. at /home/xxxx/public_html/vendor/magento/framework/Data/Collection.php:404)"} 

也是这个错误

Integrity constraint violation: 1052 Column 'created_at' in order clause is ambiguous

但是当我尝试使用另一个ID时,错误消失了

在Vendor / Module / Model / ResourceModel / Order / Grid / Collection.php中

namespace Wetag\AdditionalOrderFields\Model\ResourceModel\Order\Grid;

use Magento\Framework\Data\Collection\Db\FetchStrategyInterface as FetchStrategy;
use Magento\Framework\Data\Collection\EntityFactoryInterface as EntityFactory;
use Magento\Framework\Event\ManagerInterface as EventManager;
use Magento\Sales\Model\ResourceModel\Order\Grid\Collection as OriginalCollection;
use Psr\Log\LoggerInterface as Logger;

/**
 * Order grid extended collection
 */
class Collection extends OriginalCollection
{
    protected $helper;

    public function __construct(
        EntityFactory $entityFactory,Logger $logger,FetchStrategy $fetchStrategy,EventManager $eventManager,$mainTable = 'sales_order_grid',$resourceModel = \Magento\Sales\Model\ResourceModel\Order::class
    )
    {
        parent::__construct($entityFactory,$logger,$fetchStrategy,$eventManager,$mainTable,$resourceModel);
    }

protected function _renderFiltersBefore()
{
    $joinTable = $this->getTable('sales_order');
    $joinTable_track = $this->getTable('sales_shipment_track');
    
    
    $this->getSelect()->joinLeft($joinTable,'main_table.entity_id = sales_order.entity_id',['shipping_information'])->distinct();
    $this->getSelect()->joinLeft($joinTable_track,'sales_order.entity_id = sales_shipment_track.order_id',['track_number'])->distinct();
    parent::_renderFiltersBefore();
}
protected function _initSelect()  {

    $this->addFilterToMap('increment_id','main_table.increment_id');
    $this->addFilterToMap('status','main_table.status');
    parent::_initSelect();
  
   return $this; 

}
}

在Vendor / Module / etc / di.xml

<?xml version="1.0"?>
    <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory">
        <arguments>
            <argument name="collections" xsi:type="array">
                <item name="sales_order_grid_data_source" xsi:type="string">Vendor\Module\Model\ResourceModel\Order\Grid\Collection</item>
            </argument>
        </arguments>
    </type>
    <type name="Vendor\Module\Model\ResourceModel\Order\Grid\Collection">
        <arguments>
            <argument name="mainTable" xsi:type="string">sales_order_grid</argument>
            <argument name="resourceModel" xsi:type="string">Magento\Sales\Model\ResourceModel\Order</argument>
        </arguments>
      </type>
</config>

在etc / module.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
    <module name="Vendor_Module" setup_version="1.0.0">
       <sequence>
           <module name="Magento_sales" />
       </sequence>
    </module>
</config>

在Vendor / Module / view / adminhtml / ui_component / sales_order_grid.xml中

<?xml version="1.0" encoding="UTF-8"?>
<listing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
    <columns name="sales_order_columns">
    
        <column name="shipping_information">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="filter" xsi:type="string">text</item>
                    <item name="label" xsi:type="string" translate="true">Shipping method</item>
                </item>
            </argument>
        </column>
        <column name="track_number">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="filter" xsi:type="string">text</item>
                    <item name="label" xsi:type="string" translate="true">Tracking number</item>
                </item>
            </argument>
        </column>
    </columns>
</listing>

我喜欢在order_sales_grid表中使用shipping_information字段,没有左联接就没有得到它,我喜欢选择没有联接的情况

解决方法

我通过按entity_id -> group('main_table.entity_id')分组解决了该问题,以删除重复的行并删除LeftJoin到Sales_order表,因为sales_order_grid表中已经存在shipping_information

protected function _renderFiltersBefore()
{
    $joinTable_track = $this->getTable('sales_shipment_track');
    $this->getSelect()->joinLeft($joinTable_track,'main_table.entity_id = sales_shipment_track.order_id',['track_number'])->group('main_table.entity_id');
parent::_renderFiltersBefore();
}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...