使用Magento的addFieldToFilter按现有列进行过滤

时间:2009-03-16 22:48:08

标签: php orm magento entity-attribute-value

假设情况。我想在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概念是:

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

这是否可以纯粹使用对象方法调用,或者我是否需要进行后加载过滤?

其他ORM系统如何处理此问题?

3 个答案:

答案 0 :(得分:4)

我正在等待一个明确的答案,但看到什么都没有出现,我不妨分享我发现的东西。 我跟踪了addFieldToFilter,显然你使用的每个值最终都被引用,所以你不能通过使用列的名称来“破解”它。 事实上,我认为没有办法做到这一点,至少在这个课程中没有。

实际上我认为你需要采用后加载过滤,至少目前是这样。这当然是效率低下的代码的定义,但如果计算效率是优先考虑的话,那么你首先就不会使用Magento ......

答案 1 :(得分:1)

我必须在我的一个项目中解决这个问题,并在寻找更好的解决方案时遇到了这个问题。我的黑客看起来像这样:

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

令我很生气的是,Magento的ORM忽略了数据库的这种基本功能。

答案 2 :(得分:1)

有一个“礼貌”的解决方法。 请参阅下面的示例,其中尝试过滤created_at <= expire_at的位置。

Mage::getSingleton('foo/bar')->getCollection()
            ->addExpressionFieldToSelect('expired', '(created_at >= expire_at)', ['created_at' , 'expire_at'])
            ->addFilter('(created_at >= expire_at)', 0)

这很愚蠢,但是仍然可以使用该类解决问题。

PS:我希望在发布此问题11年后,您已经解决了这个问题。 :D(开个玩笑。我喜欢你的工作。)