В чем отличие addAttributeToFilter () от addFieldToFilter ()?

21

Я немного запутался, в чем разница между функциями addAttributeToFilter () и addFieldToFilter (). Я проверил основные файлы в magento. Но я не мог понять четкую идею. Потому что для некоторых коллекций в magento использовалась addAttributeToFilter (), а некоторые использовали addFieldToFilter (). Пожалуйста, любые разъяснения по этому вопросу будут очень полезны. Заранее спасибо.

Sukeshini
источник

Ответы:

45

addAttributeToFilter() используется для фильтрации коллекций EAV.

addFieldToFilter() используется для фильтрации коллекций не-EAV.

EAV-модели - это, например, продукт, клиент, продажи и т. Д., Поэтому вы можете использовать их addAttributeToFilter()для этих объектов.

addFieldToFilter()сопоставляется addAttributeToFilter()для сущностей EAV. Так что вы можете просто использовать addFieldToFiler().

Редактировать:

Вы можете посмотреть, app/code/core/Mage/Eav/Model/Entity/Collection/Abstract.phpгде сделано Mapping:

public function addFieldToFilter($attribute, $condition = null) {
    return $this->addAttributeToFilter($attribute, $condition);
}
Анна Фёлькл
источник
отличный ответ. Браво. это позволяет мне выяснить, где вещи. он сообщает мне, что можно использовать с EAV, даже если он может обрабатывать не EAV. это действенно, и это дает читателям инструменты, чтобы понять больше, а не только ответ на этот конкретный вопрос. Не могли бы вы ответить на вопрос о разнице между addAttributeToSelect()против addAttributeToFilter()?
Анбизкад
1
Разница заключается в части SQL, которая подвергается воздействию: addAttributeToSelect()ссылается на SELECTчасть запроса и выбирает только определенные столбцы. addFAttributeToFilter()используется для фильтрации коллекции и поэтому добавляется в WHEREдеталь.
Анна Фёлькл
3

Что касается EAV, нет никакой разницы.

/app/code/core/Mage/Eav/Model/Entity/Collection/Abstract.php
public function addFieldToFilter($attribute, $condition = null)
{
    return $this->addAttributeToFilter($attribute, $condition);
}

Мое предположение, хотя я могу ошибаться, заключается в том, что для EAV они используют именование атрибутов, поскольку каждый атрибут для фильтрации сам по себе является отдельным элементом, который имеет свои собственные настройки и т. Д. Где, когда EAV не используется, это просто еще один столбец на таблица базы данных и поэтому имя поля работает хорошо.

Дэвид Мэннерс
источник