1

Magento の比較的新しいユーザーであり、SQL のさらに新しいユーザーとして、この質問はばかげたものになる可能性があります。

Magento API を使用して SQL クエリを作成するのに非常に苦労しています。API に変換しようとしているクエリは、すぐ下にあります。

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 = '';

Magento コレクション クエリと結果の SQL に関して、これまでに得たものは以下のとおりです。

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 クエリ:

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 = '')

以下にいくつか質問があります。

1) SQL クエリの先頭にある「1 AS」はどこから来て、どうすればそれを残すことができますか?

2)どこstatusで , e. entity_idetype_ideattribute_set_ideitem_nr、およびeitem_nrから来る?私はちょうどフィルタリングしようとしたと思いましたeitem_nrおよび「b.product_id」? 「b.product_id」さえありません。

3) RIGHT/LEFT JOIN だけでなく、RIGHT/LEFT OUTER/INNER JOIN を指定するにはどうすればよいですか?

これらの助けをいただければ幸いです。

4

1 に答える 1

1

あなたの質問は複雑なものであり、答えるには Stack Overflow の投稿以上のものが必要です。代わりに、正しい方向に向かうためのヒントと背景情報を次に示します。

Magento は、Zend Framework のクラスを使用してデータベース クエリを実行します。メソッドを使用すると、から継承getSelectするオブジェクトが返されます。Varien_Db_SelectZend_Db_Select

幸いなことに、Zend Framework で動作するものはすべて、Magento の選択でも動作します。Zend FrameworkでRIGHT/LEFT OUTER/INNER JOIN情報を検索すると、Magento で同じ情報を検索するよりも多くの結果が得られます。

複雑なのは、Magento の EAV オブジェクトです。製品は EAV モデルです。つまり、一部の基本フィールド情報がcatalog_product_entityテーブルに格納され、追加の属性情報がcatalog_product_entity_*テーブルに格納されます。カテゴリも EAV モデルであり、カテゴリが再帰的にネストされた階層を SQL テーブルに実装するというひねりが加えられています。

さらに複雑なのは、Magento の「インデックス」テーブルにあります。Magento は、比較的正規化されたデータベースで誕生しました。つまり、糖蜜のように低速でした。何年にもわたって、多くのモデル (最も重要な製品) は、正規化されていないインデックス テーブルを実装して、通常のストア操作中の選択/結合を少なくしました。(実際のデータベース関係者は、ここでの正規化という言葉の使用にうんざりするでしょう — 過度の単純化に関する通常の警告が適用されます)

これはすべて、これらのコレクションの 1 つで 、またはその他の属性ベースのフィルタリング メソッドを呼び出すとaddAttributeToFilter、モデルごとに大量のカスタム SQL コードが実行されることを意味します。これらのメソッドを呼び出さなくても、インデックス テーブルへの読み取り、インデックスの更新、またはデータ モデル レイヤーに作用するその他の機能ベースのコードのための多くのカスタム ロジックがあります。

1 AS statusstatusおよびe。_ entity_idetype_ideattribute_set_ideitem_nr、およびeitem_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 に答える