sql >> Databasteknik >  >> RDS >> Mysql

Hur lägger man till anpassad kolumn i försäljnings-/orderrutnät i Magento?

Om i din _prepareCollection metod Jag skriver ut frågan via:

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

Jag förstår detta:

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

Genom denna fråga kommer jag alltid att få ett resultat, även en "tom" rad när det inte finns några beställningar på bordet. Snarare tror jag att det du försöker uppnå kan göras med hjälp av subqueries:

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

Så för att översätta det för Magento skulle det se ut ungefär så här:

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

Till din poäng om de dubbla operatörstitlarna, det är att förvänta sig i ett fall som detta. Det enda sättet att undvika det är att lägga till en DISTINCT ord i underfrågan för titeln, så här:

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

Men jag är inte säker på vad du planerar att göra med denna information i rutnätet. Hoppas det hjälper.



  1. Hur man konverterar en sträng till ett datum i PostgreSQL

  2. Använda en sorteringsordningskolumn i en databastabell

  3. Använda MySQL GeoSpatial datatyper i .NET

  4. Behöver du hjälp med att skapa en enkel reskontra från mysql skuld- och kredittabeller?