2009-03-16 6 views
1

仮説的な状況。 grand_totalがtotal_paidに等しいすべてのオーダーで、sales/orderコレクションを読み込み/読み込みたいです。 addFieldToFilterを特定の値でフィルタリングすることはできますが、この方法を使用して他のデータベース値でフィルタリングすることは可能です。そうでない場合は、これを可能にするMagentoシステムにデータアクセスオブジェクトがあります。MagentoのaddFieldToFilterを使用して既存の列でフィルタリングする

$orders = Mage::getModel('sales/order'); 
$orders = $orders->getCollection(); 
$orders->addFieldToFilter('total_paid',Array('eq'=>30)); //would find all the orders that were 30 
//syntax to find all the orders whose total_paid value is equal to it's grand_total attribute 
//???????? 

私が把握してるnon-eav SQLの概念は次のとおりです。

SELECT * FROM Orders o WHERE o.total_paid = o.grand_total 

は、オブジェクトのメソッド呼び出しで、純粋に行うことが可能これは、または私はポスト負荷フィルタリングを行うために必要なのですか?

他のORMシステムはどのようにこれを処理しますか?

答えて

4

私はこれに対する明確な答えを待っていましたが、何も出てこないのを見て、私が知ったことを分かち合いました。 私はaddFieldToFilterをトレースして、使用するすべての値が引用符で囲まれたように見えるので、実際には列の名前を使用してこれを「ハックする」ことはできません。 実際に私はこれを行う方法は見当たりません。少なくともこのクラス内ではありません。

現実的には、少なくとも現在はポストロードフィルタリングが必要になると思います。これはもちろん、効率の悪いコードの定義ですが、計算効率が最優先であれば、最初はMagentoを使用しません。

+0

ええ、私はあなたがそれを扱うことができる何か(おそらく別の方法/クラスで)があると思う。 ORMはそれほど大きくない、文書化されていないORMです。 –

1

これは私のプロジェクトでより良い解決策を探している間、この質問に遭遇しました。私のハックは以下のようになります。これは、データベースのように、基本的な機能は、MagentoののORMによって見過ごされていることを私に不愉快

$orders = Mage::getModel('sales/order')->getCollection(); 
$orders->getSelect() 
     ->where('total_paid=grand_total'); 

+0

カスタムフィールド(sales_code)を使用してオーダーコレクションをフィルタリングする必要があります。しかし、それは "列が見つかりません"というエラー –

関連する問題