1

As a relatively new user of Magento and an even newer user of SQL, this question could be a dumb one.

I'm simply having a very hard time formulating an SQL query with the Magento API. The query I'm attempting to translate into the API is right below.

SELECT b.product_id, e.item_nr
FROM mag1catalog_product_flat_1 AS 'e' 
RIGHT OUTER JOIN 
mag1personal_order AS 'b'
ON b.product_id = e.item_nr
WHERE e.item_nr is null or e.erp_item_nr = '';

What I have so far in terms of a Magento collection query and the resulting SQL is below.

public function importCatalog() {


    $catalogCollect = Mage::getModel('catalog/product')->getCollection();
    $catalogCollect->addAttributeToFilter('item_nr');
    $orderflyCollect->addAttributeToFilter('b.product_id');
    $catalogCollect->getSelect()->joinRight(array('b'=>'mag1personal_order'), 'b.product_id = e.item_nr', 'e.item_nr');

    echo $catalogCollect->getSelect();

SQL Query:

SELECT 1 AS `status`, `e`.`entity_id`, `e`.`type_id`, `e`.`attribute_set_id`, `e`.`item_nr`, `e`.`item_nr` FROM `mag1catalog_product_flat_1` AS `e` RIGHT JOIN `mag1personal_order` AS `b` ON b.product_id = e.item_nr WHERE (e.item_nr = '')

I have a few questions below.

1) Where is "1 AS" at the beginning of the SQL query coming from and how do I get it to leave?

2) Where did status, e.entity_id, e.type_id, e.attribute_set_id, e.item_nr, and e.item_nr come from? I thought I tried to filter just e.item_nr and 'b.product_id'? 'b.product_id' isn't even there.

3) How does one specify a RIGHT/LEFT OUTER/INNER JOIN and not just a RIGHT/LEFT JOIN?

Any help with these would be greatly appreciated.

4

1 回答 1

1

您的问题很复杂,需要的不仅仅是 Stack Overflow 帖子来回答。相反,这里有一些提示和背景信息,可以让您朝着正确的方向前进。

Magento 使用 Zend 框架中的类来执行其数据库查询。当您使用该getSelect方法时,您将返回一个Varien_Db_Select继承自Zend_Db_Select.

好消息是,这意味着任何适用于 Zend 框架的东西也适用于 Magento 的选择。搜索RIGHT/LEFT OUTER/INNER JOINZend Framework 的信息将产生比使用 ​​Magento 搜索相同的更多结果。

使事情复杂化的是 Magento 的 EAV 对象。产品是一种EAV模型,即一些基础字段信息存储在catalog_product_entity表中,附加属性信息存储在catalog_product_entity_*表中。类别也是一种 EAV 模型,增加了类别在 SQL 表中实现递归嵌套层次结构的变化。

进一步的复杂性来自 Magento 的“索引”表。Magento 以一个相对规范化的数据库开始生活——这意味着它像糖蜜一样慢。多年来,许多模型(最重要的产品)实施了非规范化索引表,以允许在正常存储操作期间进行更少的选择/连接。(真正的数据库人员会对我在这里使用规范化这个词感到畏缩——通常会发出关于过度简化的警告)

所有这一切意味着当您addAttributeToFilter在其中一个集合上调用 或其他基于属性的过滤方法时,每个模型都会运行大量自定义 SQL 代码。即使不调用这些方法,也有很多自定义逻辑用于读取索引表、刷新索引或其他基于特征的代码,这些代码会进入数据模型层。

,1 AS status以及status, eentity_id, e. type_id, e. attribute_set_id, e. item_nr, 和e. item_nr字段都是使 EAV 和产品功能正常工作所需的额外字段的一部分。如果您对添加这些内容的位置感兴趣,请从产品集合类开始

app/code/core/Mage/Catalog/Model/Resource/Product/Collection.php

然后沿着类层次结构向下工作。

app/code/core/Mage/Catalog/Model/Resource/Collection/Abstract.php
app/code/core/Mage/Eav/Model/Entity/Collection/Abstract.php    
lib/Varien/Data/Collection/Db.php    

欢迎来到 Magento,祝你好运!

于 2013-05-10T21:38:51.150 回答