0
protected function _prepareCollection()
{
    $collection = Mage::getResourceModel($this->_getCollectionClass());
    $collection->getSelect()->join('sales_flat_order_address', 'main_table.entity_id = sales_flat_order_address.parent_id',array('company'));
    $this->setCollection($collection);
}

上記のコードを使用して、注文リスト グリッドに会社フィールドを追加します。しかし、「同じID「1038」のアイテム(Mage_Sales_Model_Order)が既に存在します」と表示されます

4

1 に答える 1

0

代わりに内部結合を試してみてください:

$collection->getSelect()->joinInner(
    array(
        'order_address' => 'sales_flat_order_address'
    ),
    'order_address.parent_id = main_table.entity_id'
);

また、SQL をエコーアウトしてコレクションが返す内容を確認し、データベースでその SQL を実行してみてください。これは、何が間違っているのかを理解するのに役立ちます。

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

それだけでは列がグリッドに追加されないことに注意してください。列を追加する必要があります_prepareColumns()

編集: 実際、考えてみると、内部結合はおそらくここでは役に立ちません。問題は、sales_flat_order_address にすべての parent_id の複数のエントリが含まれているため、GROUP BY または SELECT DISTINCT を使用して重複を考慮する必要があることです。このようなことを試してください:

$collection->getSelect()->joinInner(
    array(
        'order_address' => 'sales_flat_order_address'
    ),
    'order_address.parent_id = main_table.entity_id'
)->group(array('entity_id', 'parent_id'));

完璧ではありませんが、1 つの注文に多くの住所があるため、あなたがやろうとしていることは本質的に不完全です。別の方法は、請求先住所のみ、または配送先住所のみで明示的に結合することです。

于 2012-04-18T00:13:18.387 に答える