sql >> Databáze >  >> RDS >> Mysql

Jak přidat vlastní sloupec do mřížky prodeje/objednávky v Magento?

Pokud ve vaší _prepareCollection metoda Tisknu dotaz přes:

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

Chápu toto:

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

Tímto dotazem vždy dostanu výsledek, dokonce i "prázdný" řádek, když na stole nejsou žádné objednávky. Spíše si myslím, že to, čeho se snažíte dosáhnout, lze provést pomocí dílčích dotazů:

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

Takže přeložit to pro Magento, vypadalo by to nějak takto:

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

K vašemu bodu o duplicitních názvech nosičů, to lze v případě, jako je tento, očekávat. Jediný způsob, jak to obejít, je přidat DISTINCT slovo v dílčím dotazu na titul, takto:

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

Ale nejsem si jistý, co s těmito daty v mřížce plánujete dělat. Doufám, že to pomůže.



  1. Funkce oddílu COUNT() OVER možná pomocí DISTINCT

  2. Databázový model pro online průzkum. Část 2

  3. Návrh databáze MySQL s internacionalizací

  4. Jak mohu efektivně využít hodnoty zeměpisné délky/šířky v Mysql?