Mysql
 sql >> Database >  >> RDS >> Mysql

Come aggiungere una colonna personalizzata nella griglia vendite/ordini in Magento?

Se nella tua _prepareCollection metodo Stampo la query tramite:

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

Ho questo:

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 questa query otterrò sempre un risultato, anche una riga "vuota" quando non ci sono ordini sul tavolo. Piuttosto, penso che ciò che stai cercando di ottenere può essere fatto usando le sottoquery:

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`;

Quindi per tradurlo per Magento, sembrerebbe qualcosa del genere:

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();
}

Per quanto riguarda i titoli dei vettori duplicati, c'è da aspettarselo in un caso come questo. L'unico modo per aggirare il problema è aggiungere un DISTINCT word nella sottoquery per il titolo, in questo modo:

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

Ma non sono sicuro di cosa intendi fare con questi dati nella griglia. Spero di esserti stato d'aiuto.