Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie füge ich eine benutzerdefinierte Spalte im Verkaufs-/Bestellraster in Magento hinzu?

Wenn in Ihrer _prepareCollection Methode drucke ich die Abfrage über:

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

Ich verstehe:

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

Durch diese Abfrage erhalte ich immer ein Ergebnis, sogar eine "leere" Zeile, wenn keine Bestellungen auf dem Tisch liegen. Vielmehr denke ich, dass das, was Sie erreichen möchten, mit Unterabfragen erreicht werden kann:

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

Um das für Magento zu übersetzen, würde es ungefähr so ​​​​aussehen:

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

Zu Ihrem Punkt zu den doppelten Trägertiteln, das ist in einem Fall wie diesem zu erwarten. Die einzige Möglichkeit, dies zu umgehen, besteht darin, einen DISTINCT hinzuzufügen Wort in der Unterabfrage für den Titel, etwa so:

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

Aber ich bin mir nicht sicher, was Sie mit diesen Daten im Grid machen wollen. Hoffe das hilft.