Да, вы используете правильный синтаксис для фильтрации по null
.
array(
'coupon_code' => array(
'null' => 'this_value_doesnt_matter'
)
)
Magento отображает * метод API sales_order.list
до Mage_Sales_Model_Order_Api::items()
.
public function items($filters = null)
{
:
$collection = Mage::getModel("sales/order")->getCollection()
:
if (is_array($filters)) {
try {
foreach ($filters as $field => $value) {
if (isset($this->_attributesMap['order'][$field])) {
$field = $this->_attributesMap['order'][$field];
}
$collection->addFieldToFilter($field, $value);
}
} catch (Mage_Core_Exception $e) {
$this->_fault('filters_invalid', $e->getMessage());
}
}
:
}
Метод items()
использует Mage_Sales_Model_Resource_Order_Collection
для извлечения заказов для вызова API. Эта коллекция основана на Varien_Data_Collection_Db
, поэтому
$collection->addFieldToFilter($field, $value)
сверху по сути звонит
Varien_Data_Collection_Db::addFieldToFilter()
Если вы последуете последнему, вы в конце наберете Varien_Db_Adapter_Pdo_Mysql::prepareSqlCondition()
, а параметры будут
$fieldName = 'coupon_code'
$condition = array('null' => 'null')
Выдержка из этого метода:
public function prepareSqlCondition($fieldName, $condition)
{
$conditionKeyMap = array(
'eq' => "{{fieldName}} = ?",
:
'notnull' => "{{fieldName}} IS NOT NULL",
'null' => "{{fieldName}} IS NULL",
:
'sneq' => null
);
:
$query = '';
if (is_array($condition)) {
:
$key = key(array_intersect_key($condition, $conditionKeyMap));
if (isset($condition['from']) || isset($condition['to'])) {
:
} elseif (array_key_exists($key, $conditionKeyMap)) {
$value = $condition[$key];
if (($key == 'seq') || ($key == 'sneq')) {
:
}
$query = $this->_prepareQuotedSqlCondition($conditionKeyMap[$key], $value, $fieldName);
} else {
:
}
}
:
}
В вашем случае _prepareQuotedSqlCondition()
будет вызываться с
$text = '{{fieldName}} IS NULL'
$value = 'null'
$fieldName = 'coupon_code'
, что приведет к $query = 'coupon_code IS NULL'
.
Если присмотреться к методу конвертации
protected function _prepareQuotedSqlCondition($text, $value, $fieldName)
{
$sql = $this->quoteInto($text, $value);
$sql = str_replace('{{fieldName}}', $fieldName, $sql);
return $sql;
}
вы также увидите, почему значение пары 'null' => 'null'
ключ / значение вообще не имеет значения. Это потому, что $text
будет '{{fieldName}} IS NULL'
, т. Е. Не содержит привязки ?
.
Следовательно, заменить _quoteInto()
^^
нечего
* см. app/code/core/Mage/Sales/etc/api.xml