Saya mempunyai jadual dengan lajur berikut (harga, tawaran istimewa, adakah ia dijual).
+-------+------+-----------------+--------------+---------+ | id | price | special_price | is_special | qty | +-------+-------------------------+--------------+----------+ | 1 | 100 | null | 0 | 5 | | 2 | 120 | 99 | 1 | 0 | | 3 | 300 | null | 0 | 1 | | 4 | 400 | 350 | 1 | 10 | | 5 | 75 | 69 | 1 | 0 | | 6 | 145 | 135 | 0 | 1 | +-------+-------+-----------------+--------------+---------+
Saya ingin menyusun produk mengikut 'harga' dan jika lajur 'istimewa' adalah benar, pilih lajur 'harga_istimewa'.
Saya mahukan keputusan berikut.
+-------+-----------+-----------------+--------------+--------------+ | id | price | special_price | is_special | qty | +-------+-----------------------------+--------------+--------------+ | 5 | 75 | 69 | 1 | 0 | | 2 | 120 | 99 | 1 | 0 | | 1 | 100 | null | 0 | 5 | | 6 | 145 | 135 | 0 | 1 | | 3 | 300 | null | 0 | 1 | | 4 | 400 | 350 | 1 | 10 | +-------+-----------+-----------------+--------------+--------------+
Dalam SQL mentah ia kelihatan seperti
SELECT * FROM products ORDER BY IF(is_special=0, price, special_price ) ASC;
Saya menggunakan Laravel dan ingin mengisih pembina pertanyaan dan mendapatkan hasilnya.
Sebagai contoh, saya melakukan ini menggunakan sifat maya
/** * 获取当前价格 * * @return mixed */ public function getCurrentPriceAttribute() { return $this->is_special ? $this->special_price : $this->price; }
Kemudian koleksi disusun$products->sortBy('current_price')
, tetapi kali ini saya ingin mendapatkan pembina pertanyaan dalam hasilnya.
Pembina Pertanyaan tidak boleh menggunakan sifat maya.
Saya mencuba pelbagai isihan mengikut dua lajur 'harga' dan 'qty'
$query = Product::query(); $query->orderByRaw("if(is_special=0, price, special_price) " . request('price', 'ASC')); $query->orderBy('qty', request('qty', 'DESC')); $query->get();
Saya ada dua penapis 'Kuantiti' dan 'Harga'.
Dalam pelbagai jenis ini, saya ingin mengisih produk mengikut harga dan kemudian mengisih semua produk mengikut 'qty'. Produk dengan qty == 0 perlu mengikut semua produk dengan qty > 0.
Tolong bantu saya.
Soalan pertama
Pembina pertanyaan tidak mempunyai pengakses, anda perlu memilihnya:
PS: Adalah disyorkan untuk mengisih dalam pangkalan data, pertimbangkan bahawa jika terdapat
paginate
pada produk, ia hanya akan mengisih data halaman yang dikembalikan.Soalan kedua:
qty > 0
AS 1,qty = 0
AS 0, kemudian susun mengikut tertib menurun:Isih mengikut permintaan
price
Isih mengikut permintaan
qty
Jadi produk akan meletakkan
:qty > 0
sebelumqty = 0
, kemudian mengisih rekodqty > 0
mengikut harga, dan kemudian; Semua produk diisih mengikutqty > 0
放在qty = 0
之前,然后将qty > 0
的记录按照价格排序,然后所有产品按照qty
排序;qty = 0
的记录将按照价格排序,然后所有产品也按照qty
; rekod denganqty = 0
akan diisih mengikut harga, dan kemudian semua produk juga diisih mengikutorderByRaw("if(is_special=0, price, special_price) " . request('price', 'ASC')
容易受到SQL注入的攻击。改为orderBy(DB::raw("IF(is_special=0, price, special_price)"), request('price', 'ASC'))
:orderByRaw("if(is_special=0, price, special_price) " . request('price', 'ASC')
terdedah kepada SQL injection🎜. Tukar kepadaorderBy(DB::raw("IF(is_special=0, price, special_price)"), request('price', 'ASC'))
🎜