OK, sprawdźmy je. Pierwszą różnicą jest to, że addFilter()
jest bardziej ogólna, a nie specyficzna dla bazy danych. Służy również Varien_Directory_Collection
do filtrowania według nazwy pliku. Ale na tę odpowiedź zamierzam się skupić Varien_Data_Collection_Db
.
Metody te mają inną sygnaturę, która addFilter
wydaje się mniej elastyczna, ale zobaczysz, że ma ona również swoje zalety:
1. addFieldToFilter ()
/**
* Add field filter to collection
*
* @see self::_getConditionSql for $condition
*
* @param string|array $field
* @param null|string|array $condition
*
* @return Mage_Eav_Model_Entity_Collection_Abstract
*/
public function addFieldToFilter($field, $condition = null)
Parametry
addFieldToFilter () może przyjmować tablicę pól z tablicą warunków lub pojedyncze pole z jednym warunkiem:
addFieldToFilter('field', 'value')
Prowadzi do: field=value
addFieldToFilter(['field1', 'field2'], ['value1', 'value2']);
Prowadzi do: field1=value1 OR field2=value2
Każdy warunek może być:
- pojedyncza wartość skalarna (jak
'value1'
i 'value2'
powyżej)
- tablica w formie
[ operator => value ]
Zend_Db_Expr
przedmiot
- tablica warunków, które są połączone z „LUB” (tak, to rekurencyjne)
Ta, zwłaszcza składnia „operator => wartość” jest udokumentowana w kodzie pod adresem Varien_Db_Adapter_Pdo_Mysql::prepareSqlCondition()
- pamiętaj o tym, często je sprawdzam:
* If $condition integer or string - exact value will be filtered ('eq' condition)
*
* If $condition is array - one of the following structures is expected:
* - array("from" => $fromValue, "to" => $toValue)
* - array("eq" => $equalValue)
* - array("neq" => $notEqualValue)
* - array("like" => $likeValue)
* - array("in" => array($inValues))
* - array("nin" => array($notInValues))
* - array("notnull" => $valueIsNotNull)
* - array("null" => $valueIsNull)
* - array("moreq" => $moreOrEqualValue)
* - array("gt" => $greaterValue)
* - array("lt" => $lessValue)
* - array("gteq" => $greaterOrEqualValue)
* - array("lteq" => $lessOrEqualValue)
* - array("finset" => $valueInSet)
* - array("regexp" => $regularExpression)
* - array("seq" => $stringValue)
* - array("sneq" => $stringValue)
*
* If non matched - sequential array is expected and OR conditions
* will be built using above mentioned structure
Istnieje dodatkowa nieudokumentowana funkcja w from
/ to
operator:
- z i
['from' => $dateFrom, 'to' => $dateTo, 'date' => true]
$dateFrom
$dateTo
wartości będą przetwarzane tak terminach. Mogą być w dowolnej formie zaakceptowanej przezVarien_Date::formatDate()
- jeśli potrzebujesz datę analizowania funkcji ale tylko porównać jedną
<=
lub >=
można pominąć albo 'from'
albo 'to'
.
'datetime' => true
ma również działać i uwzględniać czas, nie tylko dzień, ale jest błąd w Varien_Db_Adapter_Pdo_Mysql :: _ preparSqlDateCondition () (brak $includeTimestamp
parametru), który sprawia, że datetime
działa tak samo jak date
. Oba obejmują czas. Więc jeśli trzeba porównać tylko według daty, dodać 00:00:00
do from
daty i 23:59:59
do to
tej pory.
Mapowanie pola
Metoda wykorzystuje mapowanie pól. Odwzorowania pól można zdefiniować w konkretnych klasach kolekcji, aby utworzyć aliasy nazw pól. Oto przykład z kolekcji produktów:
protected $_map = array('fields' => array(
'price' => 'price_index.price',
'final_price' => 'price_index.final_price',
'min_price' => 'price_index.min_price',
'max_price' => 'price_index.max_price',
'tier_price' => 'price_index.tier_price',
'special_price' => 'price_index.special_price',
));
2. addFilter ()
/**
* Add collection filter
*s
* @param string $field
* @param string $value
* @param string $type and|or|string
*/
public function addFilter($field, $value, $type = 'and')
Parametry
addFilter()
pozwala tylko na filtrowanie pojedynczego pola według pojedynczej wartości i typu . $type
może być dowolnym z:
- „i” (domyślnie) - dodaje
AND $field=$value
do klauzuli WHERE (oczywiście z prawidłowym cytowaniem)
- „lub” - dodaje
"OR $field=$value
do klauzuli WHERE (podobnie)
- „ciąg” - dodaje
AND $value
do klauzuli WHERE (tzn. wartość $ może być dowolnym wyrażeniem SQL)
- „public” - używa mapowania pól i
_getConditionSql()
podobnie jak addFieldToFilter()
. To sprawia, że jest prawie tak samo wydajny, brakuje tylko funkcji dodawania wielu filtrów dla różnych pól w połączeniu z OR.
W Varien_Data_Collection_Db::_renderFilters()
można zobaczyć w jaki sposób są one przetwarzane.
Rozciągliwość
Jest jedna ważna różnica, która jest zaletą addFilter()
. Zbiera filtry, które mają zostać zastosowane, $this->_filters()
i dodaje je tylko do Zend_Db_Select
obiektu zapytania tuż przed załadowaniem kolekcji. addFieldToFilter()
z drugiej strony natychmiast manipuluje obiektem zapytania.
Umożliwia to manipulowanie lub usuwanie filtrów, które zostały już dodane. Kolekcja Varien nie ma dla niej interfejsu, musisz zaimplementować to w swojej kolekcji niestandardowej. Istnieje metoda haka _renderFiltersBefore()
, którą można zastąpić.
addFilter
zattributes
?Kolekcja Magento ma dwie metody filtrowania poniżej
addFieldToFilter ($ field, $ condition = null)
Pierwszy parametr
addFieldToFilter
to atrybut, według którego chcesz filtrować. Druga to wartość, której szukasz. Oto dodajemysku
filtr wartościn2610
.Drugi parametr może być również użyty do określenia rodzaju filtrowania, które chcesz wykonać. W tym miejscu sprawy stają się trochę skomplikowane i warto je zagłębić nieco głębiej.
Więc domyślnie następujące
jest (zasadniczo) równoważny z
Sprawdź sam. Uruchamianie następujących
ustąpi
Pamiętaj, że może to szybko się skomplikować, jeśli używasz atrybutu EAV. Dodaj atrybut
i zapytanie staje się niepoprawne.
Nie spiesz się, ale staraj się nie myśleć za dużo o SQL, jeśli dotrzymasz terminu.
Inne operatory porównania Jestem pewien, że zastanawiasz się „co jeśli chcę czegoś innego niż równa się zapytaniem”? Nie równy, większy niż, mniejszy itp. Drugi parametr metody addFieldToFilter również tam uwzględniał. Obsługuje alternatywną składnię, w której zamiast przekazywać ciąg, przekazujesz pojedynczy element Array.
Kluczem tej tablicy jest rodzaj porównania, które chcesz wykonać. Wartość powiązana z tym kluczem to wartość, według której chcesz filtrować. Ponówmy powyższy filtr, ale z tą jawną składnią
Wywoływanie naszego filtra
Jak widać, drugim parametrem jest tablica PHP. Jego kluczem jest eq, co oznacza równość. Wartość tego klucza to n2610, czyli wartość, którą filtrujemy.
Magento ma wiele takich anglojęzycznych filtrów, które przyniosą łzę pamięci (i być może bólu) wszystkim starym programistom Perla na widowni.
Poniżej wymienione są wszystkie filtry wraz z przykładem ich odpowiedników SQL.
Większość z nich jest oczywista, ale kilka zasługuje na specjalne objaśnienie
in, nin, find_in_set Warunki warunkowe in i nin pozwalają przekazać tablicę wartości. Oznacza to, że część wartości tablicy filtrów może sama być tablicą.
notnull, null Słowo kluczowe NULL jest wyjątkowe w większości odmian SQL. Zwykle nie gra dobrze ze standardowym operatorem równości (=). Podanie notnull lub null jako typu filtru zapewni poprawną składnię dla porównania NULL, ignorując przy tym jakąkolwiek przekazywaną wartość
from - to filter Jest to kolejny specjalny format, który łamie standardową regułę. Zamiast tablicy z jednym elementem określasz tablicę z dwoma elementami. Jeden element ma klucz, a drugi ma klucz do. Jak wskazano na kluczach, ten filtr pozwala konstruować zakres od / do bez martwienia się o symbole większe i mniejsze niż
Powyższe daje
AND lub OR, czy to jest OR i AND? Wreszcie dochodzimy do operatorów boolowskich. To rzadki moment, w którym filtrujemy tylko według jednego atrybutu. Na szczęście kolekcje Magento nas obejmują. Możesz połączyć wiele połączeń w addFieldToFilter, aby uzyskać szereg zapytań „ORAZ”.
Łącząc ze sobą wiele wywołań, jak powyżej, stworzymy klauzulę where, która wygląda mniej więcej tak:
Dla tych z was, którzy właśnie podnieśli rękę, tak, powyższy przykład zawsze zwróci 0 rekordów. Żadne SKU nie może zaczynać się od OBA i a i b. Prawdopodobnie chcemy tutaj zapytania OR. To prowadzi nas do kolejnego mylącego aspektu drugiego parametru addFieldToFilter.
Jeśli chcesz zbudować zapytanie OR, musisz przekazać tablicę tablic filtrów jako drugi parametr. Uważam, że najlepiej przypisać indywidualne tablice filtrów do zmiennych
a następnie przypisz tablicę wszystkich moich zmiennych filtrów
Dla jasności, oto wspomniana tablica tablic filtrujących.
To da nam klauzulę WHERE, która wygląda mniej więcej tak:
addFilter()
pozwala tylko na filtrowanie pojedynczego pola według pojedynczej wartości i typu.$type
może być dowolnym z:Zobacz więcej szczegółów
źródło