sql >> データベース >  >> RDS >> Mysql

Magentoの販売/注文グリッドにカスタム列を追加するにはどうすればよいですか?

    _prepareCollectionにある場合 メソッド私は次の方法でクエリを印刷します:

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

    私はこれを手に入れました:

    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
    

    このクエリによって、テーブルに注文がない場合の「空の」行でさえ、常に結果が得られます。むしろ、あなたが達成しようとしていることは、サブクエリを使用して実行できると思います:

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

    したがって、Magentoの場合、次のように変換されます。

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

    重複するキャリアタイトルについてのあなたのポイントに、それはこのような場合に予想されることです。それを回避する唯一の方法は、DISTINCTを追加することです 次のように、タイトルのサブクエリ内の単語:

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

    しかし、グリッド内のこのデータをどのように処理する予定かはわかりません。お役に立てば幸いです。



    1. Oracleドキュメント

    2. Oracleのselectステートメントの結果としてのコンマ区切りリスト

    3. mysqlの最大結合テーブルはいくつですか?そしてそれを数える方法は?

    4. Android.comのSQLデータベースへのデータの保存チュートリアルを理解する