sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo agregar una columna personalizada en la cuadrícula de ventas/pedidos en Magento?

Si en su _prepareCollection método imprimo la consulta a través de:

echo $collection->getSelect()->assemble();

Me sale esto:

SELECT 
    `main_table`.*, 
    group_concat(sales_flat_shipment_track.track_number SEPARATOR ",") AS `track_number`, 
    group_concat(sales_flat_shipment_track.title SEPARATOR ",") AS `title` 

FROM `sales_flat_order_grid` AS `main_table` 

INNER JOIN `sales_flat_shipment_track` 
    ON main_table.entity_id = sales_flat_shipment_track.order_id

Con esta consulta siempre obtendré un resultado, incluso una fila "vacía" cuando no haya pedidos en la mesa. Más bien, creo que lo que está tratando de lograr se puede hacer usando subconsultas:

SELECT 
    `main_table`.*, 
    (
        SELECT 
            group_concat(`t`.`track_number` SEPARATOR ",") AS `track_number`

        FROM `sales_flat_shipment_track` AS `t`

        WHERE `main_table`.`entity_id` = `t`.`order_id`
    ),
    (
        SELECT 
            group_concat(`t`.`title` SEPARATOR ",") AS `title`

        FROM `sales_flat_shipment_track` as `t`

        WHERE `main_table`.`entity_id` = `t`.`order_id`
    )

FROM `sales_flat_order_grid` AS `main_table`;

Entonces, para traducir eso para Magento, se vería así:

protected function _prepareCollection()
{
    $collection = Mage::getResourceModel('sales/order_grid_collection');

    $collection->getSelect()
        ->from(
            array(),
            array(
                'track_number' => new Zend_Db_Expr('(
                    SELECT GROUP_CONCAT(`t`.`track_number` SEPARATOR ",")
                    FROM `sales_flat_shipment_track` as `t`
                    WHERE `main_table`.`entity_id` = `t`.`order_id`
                )'),
                'title' => new Zend_Db_Expr('(
                    SELECT GROUP_CONCAT(`t`.`title` SEPARATOR ",")
                    FROM `sales_flat_shipment_track` as `t`
                    WHERE `main_table`.`entity_id` = `t`.`order_id`
                )'),
            )
        );

    $this->setCollection($this);

    return parent::_prepareCollection();
}

En cuanto a su punto sobre los títulos de transporte duplicados, eso es de esperar en un caso como este. La única forma de evitarlo es agregar un DISTINCT palabra en la subconsulta del título, así:

SELECT GROUP_CONCAT(DISTINCT `t`.`title` SEPARATOR ",")

Pero no estoy seguro de qué planea hacer con estos datos en la cuadrícula. Espero que ayude.