Maison > Questions et réponses > le corps du texte
J'ai un tableau avec les colonnes suivantes (prix, offre spéciale, est-ce en promotion).
+-------+------+-----------------+--------------+---------+ | 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 | +-------+-------+-----------------+--------------+---------+
Je souhaite trier les produits par « prix » et si la colonne « is_special » est vraie, sélectionnez la colonne « special_price ».
Je veux les résultats suivants.
+-------+-----------+-----------------+--------------+--------------+ | 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 | +-------+-----------+-----------------+--------------+--------------+
En SQL brut, cela ressemble à
SELECT * FROM products ORDER BY IF(is_special=0, price, special_price ) ASC;
J'utilise Laravel et je souhaite trier le générateur de requêtes et obtenir les résultats.
Par exemple, j'ai fait cela en utilisant des propriétés virtuelles
/** * 获取当前价格 * * @return mixed */ public function getCurrentPriceAttribute() { return $this->is_special ? $this->special_price : $this->price; }
Ensuite, la collection est triée$products->sortBy('current_price')
, mais cette fois, je souhaite obtenir le générateur de requêtes dans les résultats.
Query Builder ne peut pas utiliser de propriétés virtuelles.
J'ai essayé le tri multiple sur deux colonnes « prix » et « quantité »
$query = Product::query(); $query->orderByRaw("if(is_special=0, price, special_price) " . request('price', 'ASC')); $query->orderBy('qty', request('qty', 'DESC')); $query->get();
J'ai deux filtres « Quantité » et « Prix ».
Dans ce tri multiple, je souhaite trier les produits par prix, puis trier tous les produits par « quantité ». Les produits avec une quantité == 0 doivent suivre tous les produits avec une quantité > 0.
S'il vous plaît, aidez-moi.
P粉2079697872023-09-23 10:17:23
Le générateur de requêtes n'a pas d'accesseurs, vous devez les sélectionner :
DB::table('products') ->select('*') ->addSelect(DB::raw('IF(is_special=0, price, special_price ) AS current_price')) ->orderBy('current_price') ->get();
PS : Il est recommandé de trier dans la base de données, considérez que s'il y a paginate
sur le produit, il ne triera que les données de la page renvoyées.
qty > 0
AS 1,qty = 0
AS 0, puis trier par ordre décroissant :
Trier par demande price
Trier par demande qty
Donc, le produit mettra qty > 0
avant qty = 0
, puis triera les enregistrements de qty > 0
par prix, puis Tous les produits sont triés par qty > 0
放在qty = 0
之前,然后将qty > 0
的记录按照价格排序,然后所有产品按照qty
排序;qty = 0
的记录将按照价格排序,然后所有产品也按照qty
; les enregistrements avec qté = 0
seront triés par prix, puis tous les produits sont également triés par
$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();PS
orderByRaw("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')
est vulnérable à injection SQL🎜. Remplacez par orderBy(DB::raw("IF(is_special=0, price, special_price)"), request('price', 'ASC'))
🎜