假设情况。我想使用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
系统如何处理此问题?
我一直在等待一个明确的答案,但是看到什么都没有了,我不妨分享一下我发现的内容。我跟踪了addFieldToFilter,显然您使用的每个值都以引号引起来,因此您无法真正通过使用列名来“破解”该值。实际上,我看不到有任何方法可以做到这一点,至少在本课程中没有。
实际上,我认为您至少现在需要进行加载后过滤。当然,这就是低效率代码的定义,但是如果计算效率是重中之重,那么您将不会首先使用Magento ...
只需在我的一个项目中解决这个问题,并在寻求更好的解决方案时遇到了这个问题。我的骇客看起来像这样:
$orders = Mage::getModel('sales/order')->getCollection();
$orders->getSelect()
->where('total_paid=grand_total');
[让我感到困扰的是,Magento的ORM忽略了数据库的这种基本功能。
有一种“礼貌”的解决方法。请参阅下面的示例,我尝试在其中过滤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(开个玩笑。我喜欢你的工作。)