Isih Laravel mengikut harga dengan syarat harga istimewa
P粉030479054
P粉030479054 2023-09-22 13:06:46
0
1
1161

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.

P粉030479054
P粉030479054

membalas semua(1)
P粉207969787

Soalan pertama

Pembina pertanyaan tidak mempunyai pengakses, anda perlu memilihnya:

DB::table('products')
   ->select('*')
   ->addSelect(DB::raw('IF(is_special=0, price, special_price ) AS current_price'))
   ->orderBy('current_price')
   ->get();

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:

  1. qty > 0 AS 1,qty = 0 AS 0, kemudian susun mengikut tertib menurun:

  2. Isih mengikut permintaan price

  3. Isih mengikut permintaan qty

Jadi produk akan meletakkan qty &gt 0 sebelum qty = 0, kemudian mengisih rekod qty &gt 0 mengikut harga, dan kemudian; Semua produk diisih mengikut qty > 0放在qty = 0之前,然后将qty > 0的记录按照价格排序,然后所有产品按照qty排序;qty = 0的记录将按照价格排序,然后所有产品也按照qty; rekod dengan qty = 0 akan diisih mengikut harga, dan kemudian semua produk juga diisih mengikut

:

$query = Product::query();
$query->orderBy(DB::raw(IF('qty > 0, 1, 0')), 'DESC');
$query->orderBy(DB::raw("IF(is_special=0, price, special_price)"), request('price', 'ASC'));
$query->orderBy('qty', request('qty', 'DESC'));
$query->get();
PSorderByRaw("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 kepada orderBy(DB::raw("IF(is_special=0, price, special_price)"), request('price', 'ASC'))🎜
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan