Magento addFieldToFilterを使用して、既存の列でフィルタリングする
-
19-08-2019 - |
質問
仮想的な状況。 grand_totalがsales/order
に等しいすべての順序で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の概念I <!>#8217; mの目的は次のとおりです:
SELECT * FROM Orders o WHERE o.total_paid = o.grand_total
これは、純粋にオブジェクトメソッド呼び出しで実行できますか、またはロード後のフィルタリングを実行する必要がありますか?
他のORM
システムはこれをどのように処理しますか?
解決
これに対する明確な答えを待っていましたが、何も出てこないので、見つけたことを共有することもできます。 私はaddFieldToFilterをトレースしましたが、使用するすべての値は引用符で囲まれているため、実際には<!> quot; hack <!> quot;これには、列の名前を使用します。 実際、少なくともこのクラス内では、これを行う方法はありません。
現実的には、少なくとも現時点では、ロード後のフィルタリングを行う必要があると思います。もちろん、これは非効率なコードの定義そのものですが、計算効率が優先される場合は、最初にMagentoを使用することはありません...
他のヒント
私のプロジェクトの1つでこれに対処しなければならなかったので、より良い解像度を探しているときにこの質問に出くわしました。私のハックは次のようになります:
$orders = Mage::getModel('sales/order')->getCollection();
$orders->getSelect()
->where('total_paid=grand_total');
MagentoのORMがこのようなデータベースの基本的な機能を見過ごしているのは気に障ります。