2

仮定の状況。sales/ordergrand_totalがに等しいすべての順序でコレクションにデータを入力/ロードしたいと思いtotal_paidます。addFieldToFilter特定の値でフィルタリングするために使用できることはわかっていますが、このメソッドを使用して他のデータベース値でフィルタリングすることは可能ですか。そうでない場合、これを可能にするデータアクセスオブジェクトがMagentoシステムにありますか。

$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

3 に答える 3

4

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

現実的には、少なくとも今のところ、ロード後のフィルタリングを使用する必要があると思います。もちろん、これは非効率的なコードの定義そのものですが、計算効率が優先される場合は、そもそも Magento を使用していないでしょう...

于 2009-03-19T12:03:06.653 に答える
1

私のプロジェクトの1つでこれに対処する必要があり、より良い解決策を探しているときにこの質問に出くわしました。私のハックは次のようになります。

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

データベースのこのような基本的な機能が Magento の ORM によって見落とされていることに腹を立てています。

于 2011-02-08T21:29:04.310 に答える