2

假设情况。我想sales/order用 grand_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

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

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

Magento 的 ORM 忽略了数据库的这种基本功能,这让我很恼火。

于 2011-02-08T21:29:04.310 回答
1

有一个“礼貌”的解决方法。请参阅下面我尝试过滤 where 的示例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(开个玩笑。我喜欢你的工作。)

于 2020-04-22T05:52:28.853 回答