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

问题描述 投票:2回答:3

假设情况。我想使用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系统如何处理此问题?

php orm magento entity-attribute-value
3个回答
4
投票

我一直在等待一个明确的答案,但是看到什么都没有了,我不妨分享一下我发现的内容。我跟踪了addFieldToFilter,显然您使用的每个值都以引号引起来,因此您无法真正通过使用列名来“破​​解”该值。实际上,我看不到有任何方法可以做到这一点,至少在本课程中没有。

实际上,我认为您至少现在需要进行加载后过滤。当然,这就是低效率代码的定义,但是如果计算效率是重中之重,那么您将不会首先使用Magento ...


1
投票

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

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

[让我感到困扰的是,Magento的ORM忽略了数据库的这种基本功能。


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(开个玩笑。我喜欢你的工作。)

© www.soinside.com 2019 - 2024. All rights reserved.