假设情况。我想在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
系统如何处理此问题?
答案 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(开个玩笑。我喜欢你的工作。)