在集合查询上左联接表


27

我正在执行以下操作以从系统中获取一些订单以进行导出:

$orders = Mage::getModel('sales/order')->getCollection()
    ->addFieldToFilter('status', $statusToExport)
    ->addFieldToFilter('store_id', $this->processingStoreId)
    ->addFieldToFilter('updated_at', array('gteq' => date('Y-m-d H:i:s', $lastSyncTime)));

如果订单在我拥有的自定义表中,我需要在导出的地方添加一些内容entity_id。如果使用的是SQL,则可以执行以下操作:

left join myTable as mt on main_table.entity_id = mt.entity_id
where mt.entity_id is null

但是我不确定如何修改集合查询来做类似的事情。

注意:我确实尝试过

$orders = $orders->getSelect()
    ->joinLeft(
        array("t1" => $myTable),
        "main_table.entity_id = t1.entity_id",
        array("admin_field_id" => "t1.id")
    )
    ->where("t1.id is null")

但这会更改它,因此这是一个查询,我希望返回销售/订单集合。

我觉得我缺少一些简单的东西...

编辑

好的,我已经试过了:

$orders->getSelect()
    ->joinLeft(
        array("t1" => $myTable),
        "main_table.entity_id = t1.entity_id",
        array("admin_field_id" => "t1.id")
    )
    ->where("t1.id is null");

当我回显(string)$orders->getSelect()它时,它将返回我期望的查询,并且在运行它时不返回任何结果。$orders但是,仍然包含项目。我以为这次加入是为了修改集合?

Answers:


53

要更改查询,您可以执行

$collection->getSelect()->doWhateverYouWantWithSelectObject();
foreach($collection as $order) {} // order collection

但是要加入表格,您可以使用 $collection->joinTable()

joinTable仅存在于Mage_Eav_Model_Entity_Collection上,这意味着:产品,类别,订单,发票,信用额度,运输,客户。(感谢@Fra的评论)

joinTable()

但是magento收集有一种方法joinTable(),我花了45分钟才弄清楚如何使用它。为避免这种情况,我分享了。

$productCollection->joinTable(
    array('bonus' => 'mycompany/bonus'), 'product_id=entity_id',
    array('bonus_id' => 'bonus_id')
);

参数为:

public function joinTable($table, $bind, $fields = null, $cond = null, $joinType = 'inner')
  1. 表很简单,它是magento namespace/entity格式,可在配置,资源模型和集合中使用。您可以使用以下格式的数组array('alias' => 'namespace/entity')
  2. 绑定表示SQL中的ON语句。这是最难的部分,我将在后面详细解释。重要的是,请在等号之前放置平板,将EAV放置在等号之后。请勿main_table.在属性之前使用。Magento将为您做到这一点。稍后再详细介绍。
  3. 字段是一个数组。如果使用字符串代替,则会得到以下信息:Warning: Invalid argument supplied for foreach() in /var/www/magento-1.6.2.0/app/code/core/Mage/Eav/Model/Entity/Collection/Abstract.php on line 775。您可以使用格式数组array('field1', 'field2', '...')array('alias' => 'field1', '...')
  4. 条件是** 哪里 SQL中的ON条件**。
  5. joinType。我希望你知道那是什么。但是您只能在LEFT和INNER之间选择app/code/core/Mage/Eav/Model/Entity/Collection/Abstract.php:793

有关此主题的更多信息


1
感谢您提供的信息。根据您的第一点,是否不应该$orders->getSelect() ->joinLeft(array("t1" => $myTable), "main_table.entity_id = t1.entity_id", array("admin_field_id" => "t1.id")) ->where("t1.id is null")将这些项目从我的当前列表中排除?
webnoob

我认为您是在加载后编辑集合。只需使用xdebug插入脚本并检查模型中的isLoaded标志即可
Fabian Blechschmidt 2013年

2
值得一提的是joinTable方法仅适用于Mage_Eav_Model_Entity_Collection
弗拉

1

我找到了原因。

应用左联接之前,我需要计数值所以我添加了

$totalOrderCount = count($orders);

但是,这导致集合被加载,这反过来又意味着它忽略了我正在进一步进行的左连接。在调试的同时,_isCollectionLoadedFabian 看过var 是一个很好的技巧。

我现在正在这样做,以获取集合的计数:

$countOrdersObjs = clone $orders;
$totalOrderCount = count($countOrdersObjs);
unset($countOrdersObjs);

这使我无需加载$orders收集数据即可计算结果。

注意:请在上面的Fabians指导中对此应用任何支持,但我认为该解决方案具有其自己的答案。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.