We have added some additional sortable / filterable columns to sales order grid using some basic joins. This would be the relevant code regarding data
app/code/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="MagentoFrameworkViewElementUiComponentDataProviderCollectionFactory">
<arguments>
<argument name="collections" xsi:type="array">
<item name="sales_order_grid_data_source" xsi:type="string">VendorModuleModelResourceModelOrderGridCollection</item>
</argument>
</arguments>
</type>
<type name="SinapsisOrderGridModelResourceModelOrderGridCollection">
<arguments>
<argument name="mainTable" xsi:type="string">sales_order_grid</argument>
<argument name="resourceModel" xsi:type="string">MagentoSalesModelResourceModelOrder</argument>
</arguments>
</type>
</config>
And then
app/code/Vendor/Module/Model/ResourceModel/Order/Grid/Collection.php
<?php
namespace VendorModuleModelResourceModelOrderGrid;
use MagentoFrameworkDataCollectionDbFetchStrategyInterface as FetchStrategy;
use MagentoFrameworkDataCollectionEntityFactoryInterface as EntityFactory;
use MagentoFrameworkEventManagerInterface as EventManager;
use MagentoSalesModelResourceModelOrder;
use MagentoSalesModelResourceModelOrderGridCollection as OrderGridCollection;
use PsrLogLoggerInterface as Logger;
class Collection extends OrderGridCollection
{
public function __construct(
EntityFactory $entityFactory,
Logger $logger,
FetchStrategy $fetchStrategy,
EventManager $eventManager,
$mainTable = 'sales_order_grid',
$resourceModel = Order::class
) {
parent::__construct($entityFactory, $logger, $fetchStrategy, $eventManager, $mainTable, $resourceModel);
}
protected function _renderFiltersBefore()
{
$joinTable = $this->getTable('sales_order');
$this->getSelect()->joinLeft(
['sales_order_table' => $joinTable],
'main_table.entity_id = sales_order_table.entity_id',
['coupon_code']
);
$joinTable = $this->getTable('sales_order_address');
$this->getSelect()->joinLeft(
['sales_order_address_table' => $joinTable],
'sales_order_table.billing_address_id = sales_order_address_table.entity_id',
['country_id', 'region', 'city', 'postcode', 'telephone']
);
parent::_renderFiltersBefore();
}
}
Now we want to add a column including some product details, such as product name, sku, etc…
How could we do the join to sales_order_item
database table, so we can concatenate all possible results in one single field per order with the products info?