recherche

Maison  >  Questions et réponses  >  le corps du texte

Laravel trier par prix avec des conditions de prix spéciales

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粉030479054P粉030479054429 Il y a quelques jours1141

répondre à tous(1)je répondrai

  • P粉207969787

    P粉2079697872023-09-23 10:17:23

    Première question

    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.


    Deuxième question :

    1. qty > 0 AS 1,qty = 0 AS 0, puis trier par ordre décroissant :

    2. Trier par demande price

    3. 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();
    
    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') est vulnérable à

    injection SQL🎜. Remplacez par orderBy(DB::raw("IF(is_special=0, price, special_price)"), request('price', 'ASC'))🎜

    répondre
    0
  • Annulerrépondre