Oke, mari kita periksa. Perbedaan pertama adalah yang addFilter()
lebih umum dan tidak spesifik database. Ini juga digunakan oleh Varien_Directory_Collection
untuk menyaring berdasarkan nama file. Tetapi untuk jawaban ini saya akan fokus Varien_Data_Collection_Db
.
Mereka metode memiliki tanda tangan yang berbeda, di mana addFilter
tampaknya kurang fleksibel, tetapi Anda akan melihat bahwa itu memiliki kelebihan juga:
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)
Parameter
addFieldToFilter () dapat mengambil array bidang dengan array kondisi, atau bidang tunggal dengan satu kondisi:
addFieldToFilter('field', 'value')
Hasil dalam: field=value
addFieldToFilter(['field1', 'field2'], ['value1', 'value2']);
Hasil dalam: field1=value1 OR field2=value2
Setiap kondisi dapat:
- nilai skalar tunggal (seperti
'value1'
dan di 'value2'
atas)
- sebuah array dalam formulir
[ operator => value ]
- sebuah
Zend_Db_Expr
objek
- berbagai kondisi yang digabungkan dengan "ATAU" (ya, itu rekursif)
Ini, terutama sintaks "operator => value" didokumentasikan dalam kode at Varien_Db_Adapter_Pdo_Mysql::prepareSqlCondition()
- ingat ini, saya sering melihatnya:
* 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
Ada fitur tidak berdokumen tambahan di from
/ to
operator:
- dengan
['from' => $dateFrom, 'to' => $dateTo, 'date' => true]
para $dateFrom
dan $dateTo
nilai-nilai akan diurai sebagai tanggal. Mereka dapat dalam bentuk apa pun yang diterima olehVarien_Date::formatDate()
- jika Anda memerlukan fitur penguraian tanggal tetapi hanya untuk membandingkan satu
<=
atau >=
, Anda dapat menghilangkan salah satu 'from'
atau 'to'
.
'datetime' => true
seharusnya berfungsi juga dan termasuk waktu, tidak hanya hari, tetapi ada bug di Varien_Db_Adapter_Pdo_Mysql :: _ prepSqlDateCondition () ( $includeTimestamp
parameter yang hilang ) yang membuat datetime
pekerjaan sama seperti date
. Keduanya termasuk waktu. Jadi jika Anda perlu membandingkan dengan saat ini hanya, tambahkan 00:00:00
ke from
tanggal dan 23:59:59
ke to
tanggal.
Pemetaan lapangan
Metode ini menggunakan pemetaan lapangan. Pemetaan bidang dapat didefinisikan dalam kelas koleksi konkret untuk membuat alias bidang. Berikut ini contoh dari koleksi produk:
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')
Parameter
addFilter()
hanya memungkinkan pemfilteran bidang tunggal dengan nilai dan tipe tunggal . $type
dapat berupa:
- "and" (default) - menambah
AND $field=$value
klausa WHERE (tentu saja dengan kutipan yang tepat)
- "atau" - menambah
"OR $field=$value
klausa WHERE (ditto)
- "string" - menambah
AND $value
klausa WHERE (mis. $ value bisa berupa ekspresi SQL arbitrer)
- "publik" - menggunakan pemetaan bidang dan
_getConditionSql()
, mirip dengan addFieldToFilter()
. Ini membuatnya hampir sama kuatnya, hanya saja fitur tersebut tidak ada untuk menambahkan beberapa filter untuk berbagai bidang yang dikombinasikan dengan OR.
Di Varien_Data_Collection_Db::_renderFilters()
Anda dapat melihat bagaimana mereka diproses.
Kemungkinan diperpanjang
Ada satu perbedaan penting yang merupakan keuntungan bagi addFilter()
. Itu mengumpulkan filter untuk diterapkan $this->_filters()
dan hanya menambahkannya ke Zend_Db_Select
objek permintaan tepat sebelum memuat koleksi. addFieldToFilter()
di sisi lain memanipulasi objek permintaan dengan segera.
Ini memungkinkan Anda untuk memanipulasi atau menghapus filter yang sudah ditambahkan. Koleksi Varien tidak memiliki antarmuka untuk itu, Anda harus menerapkan ini dalam koleksi khusus Anda. Ada metode kait _renderFiltersBefore()
yang bisa Anda timpa.
addFilter
denganattributes
?Koleksi Magento memiliki dua metode untuk penyaringan di bawah berbeda
addFieldToFilter ($ field, $ condition = null)
Parameter pertama
addFieldToFilter
adalah atribut yang ingin Anda filter. Yang kedua adalah nilai yang Anda cari. Di sini kami menambahkansku
filter untuk nilainyan2610
.Parameter kedua juga dapat digunakan untuk menentukan jenis pemfilteran yang ingin Anda lakukan. Di sinilah segala sesuatunya menjadi sedikit rumit, dan layak untuk masuk dengan sedikit lebih dalam.
Jadi secara default, berikut ini
(pada dasarnya) setara dengan
Lihatlah sendiri. Menjalankan yang berikut ini
akan menghasilkan
Ingat, ini bisa menjadi rumit dengan cepat jika Anda menggunakan atribut EAV. Tambahkan atribut
dan kueri menjadi degil.
Bukan untuk mempermasalahkan intinya, tetapi cobalah untuk tidak terlalu memikirkan SQL jika Anda berada di tenggat waktu.
Operator Perbandingan Lainnya Saya yakin Anda bertanya-tanya “bagaimana jika saya menginginkan sesuatu selain yang sama dengan kueri”? Tidak sama, lebih besar dari, kurang dari, dll. Parameter kedua metode addFieldToFilter telah Anda bahas di sana juga. Ini mendukung sintaks alternatif di mana, alih-alih meneruskan dalam string, Anda meneruskan dalam satu elemen Array.
Kunci dari array ini adalah jenis perbandingan yang ingin Anda buat. Nilai yang terkait dengan kunci itu adalah nilai yang ingin Anda filter. Mari kita ulangi filter di atas, tetapi dengan sintaks eksplisit ini
Memanggil filter kami
Seperti yang Anda lihat, parameter kedua adalah Array PHP. Kuncinya adalah eq, yang berarti sama dengan. Nilai untuk kunci ini adalah n2610, yang merupakan nilai yang kami filterkan.
Magento memiliki sejumlah filter berbahasa Inggris seperti ini yang akan membawa air mata kenangan (dan mungkin sakit) untuk setiap pengembang perl tua di penonton.
Di bawah ini adalah semua filter, bersama dengan contoh setara SQL-nya.
Sebagian besar sudah cukup jelas, tetapi beberapa pantas mendapat info khusus
in, nin, find_in_set Kondisional in dan nin memungkinkan Anda untuk melewatkan Array nilai. Artinya, bagian nilai array filter Anda sendiri diizinkan menjadi array.
notnull, null Kata kunci NULL khusus di sebagian besar rasa SQL. Biasanya tidak akan bermain bagus dengan operator kesetaraan standar (=). Menentukan notnull atau null sebagai tipe filter Anda akan memberi Anda sintaks yang benar untuk perbandingan NULL sambil mengabaikan nilai apa pun yang Anda berikan
from - to filter Ini adalah format khusus lain yang melanggar aturan standar. Alih-alih array elemen tunggal, Anda menentukan array elemen dua. Satu elemen memiliki kunci dari, elemen lainnya memiliki kunci untuk. Seperti tombol yang ditunjukkan, filter ini memungkinkan Anda untuk membangun dari / ke jangkauan tanpa harus khawatir lebih besar dari dan kurang dari simbol
Hasil di atas
DAN atau ATAU, atau ATAU dan DAN itu? Akhirnya, kami datang ke operator boolean. Ini adalah momen langka di mana kita hanya memfilter berdasarkan satu atribut. Untungnya, Koleksi Magento sudah kita liput. Anda dapat menyatukan beberapa panggilan ke addFieldToFilter untuk mendapatkan sejumlah pertanyaan "DAN".
Dengan menggabungkan beberapa panggilan seperti di atas, kami akan menghasilkan klausa tempat yang terlihat seperti berikut ini
Bagi Anda yang baru saja mengangkat tangan, ya, contoh di atas akan selalu mengembalikan 0 catatan. Tidak ada sku yang bisa dimulai dengan KEDUA a dan a. Apa yang mungkin kita inginkan di sini adalah kueri ATAU. Ini membawa kita ke aspek membingungkan lain dari parameter kedua addFieldToFilter.
Jika Anda ingin membuat kueri ATAU, Anda harus meneruskan Array Array filter sebagai parameter kedua. Saya menemukan yang terbaik untuk menetapkan Array filter individual Anda ke variabel
dan kemudian menetapkan array dari semua variabel filter saya
Untuk menjadi eksplisit, inilah Array filter yang disebutkan di atas.
Ini akan memberi kita klausa WHERE yang terlihat seperti berikut
addFilter()
hanya memungkinkan pemfilteran bidang tunggal dengan nilai dan tipe tunggal.$type
dapat berupa:Lihat Lebih Detail
sumber