Magento加入不同的表

时间:2012-05-31 13:50:44

标签: php mysql magento left-join

我的Grid.php文件中有以下代码:

function _prepareCollection () {
$collection = Mage::getResourceModel($this->_getCollectionClass());
$collection->getSelect()->joinLeft(
    array('sfog' => 'sales_flat_order_grid'),
    'main_table.entity_id = sfog.entity_id',
    array('sfog.shipping_name','sfog.billing_name')
);
$collection->getSelect()->joinLeft(
    array('sfo'=>'sales_flat_order'),
    'sfo.entity_id=main_table.entity_id',
    array(
        'sfo.customer_email',
        'sfo.weight',
        'sfo.discount_description',
        'sfo.increment_id',
        'sfo.store_id',
        'sfo.created_at',
        'sfo.status',
        'sfo.base_grand_total',
        'sfo.grand_total'
    )
);

我想添加表sales_order_item,但如果我添加此表,我会收到此错误:

具有相同ID“119”的项目(Mage_Sales_Model_Order)已存在

无论如何?

4 个答案:

答案 0 :(得分:5)

假设您加入soi表示sales_order_item,请按soi.item_id分组

$collection->getSelect()->group('soi.item_id');

答案 1 :(得分:4)

您必须使sales_flat_order_item表的entity_id列成为集合的entity_id列。您还必须重命名main_table类的entity_id列,以避免entity_id列冲突

$collection->getSelect()->joinLeft(
   array('sfoi' => 'sales_flat_order_item'),
   'sfoi.order_id=sfo.entity_id', 
   array(
      'entity_id' => 'sfoi.item_id',  // Re-assign entity_id column
      'main_table_entity_id' => 'main_table.entity_id'  // Rename original entity_id column
   )
)

答案 2 :(得分:2)

显然加入sales_order_item导致每个订单返回多行(这并不奇怪),Magento正在尝试将行数据加载到专门用于订单的集合中,其中包含检查以确保每个订单仅发生一次。该检查产生了您看到的错误。

要解决此问题,您可以:

  • 将集合类更改为“sales / order_item_collection”,每个订单项允许一行

-OR -

  • 不与sales_order_item联接,而是通过getItemsCollection()
  • 从每个订单中检索订单商品组

答案 3 :(得分:1)

这是因为自动增量值,用作id唯一来识别记录