2017-09-17 4 views
0

Il s'agit d'une application de commerce électronique avec des filtres dans lesquels les paramètres sont pris dynamiquement à partir d'une table.Problème lors de la génération d'une requête complexe à partir de plusieurs choix et d'un filtre à paramètres multiples

table "Filtres" ressemble à ce qui suit:

id | groupe | étiquette | valeur
---- + ---------- + ------------------- + ----------- -----

12 | date limite | 1 à 3 jours | 1 ET 3
14 | budget | Tout | 0
15 | budget | Moins de 1000 | 1,1000
16 | budget | 1000 à 10000 | 1000, 10000
22 | emplacement | Tout | 0
23 | emplacement | New York | newyork
24 | emplacement | Californie | californie
25 | emplacement | Alabama | alabama

L'un des paramètres parmi d'autres est: "Budget" et les options de cases à cocher sont:

Tous

1000-9999

10000-99999

100000-999999

Les utilisateurs peuvent vérifier plusieurs options ici.

Je suis en train de construire des requêtes de recherche de façon dynamique à partir de ce filtre: (voir ici https://m.dotdev.co/writing-advanced-eloquent-search-query-filters-de8b6c2598db)

Voir fichier pour les filtres:

@foreach ($groups as $group => $filters) 
       <div class="panel panel-default"> 
        <b>{{ $group }}</b> 
        @foreach($filters as $filter) 
         <div id="collapseOne1" class="panel-collapse collapse in"> 
          <div class="panel-body"> 
           <div class="checkbox"> 
            <label><input class=" 
            <?php if ($filter->value == '0') { ?> 
              {{ $filter->group }} 
            <?php } else { ?> 
               {{ $filter->group."Child" }} 
            <?php }?>" type="checkbox" name="{{ $filter->group }}" value="{{ $filter->value }}">{{ $filter->label }}</label> 
           </div> 
          </div> 
         </div> 
        @endforeach 
       </div> 
     @endforeach 

Le contrôleur a:

$requests = $requests->newQuery(); 
if ($request->has('budget')) { 
     foreach (explode(',',$request->budget) as $budget) { 
      $min = 0; 
      $max = 1; 
      if($budget < $min){ 
       $min = $budget; 
      } 
      if($budget > $max){ 
       $max = $budget; 
      } 
     } 
      $requests->whereBetween('budget',[$min, $max]); 
     } 
$requests = $requests->paginate(5); 
... 

Le Le code ci-dessus ne semble pas fonctionner car il définit toujours min = 0. Quelqu'un peut-il dire comment je peux créer une requête dynamique à partir d'un filtre multi-choix généré dynamiquement? à Laravel?

Merci à l'avance,

Répondre

0

À moins que le prix est en quelque sorte négatif, votre min $ sera toujours 0 ...? Je ne comprends pas complètement quel est le problème. Vous pouvez enchaîner des requêtes dynamiquement, mais cela semble être un problème logique, moins qu'un problème de générateur de requête?

Modifier basé sur le commentaire:

Le problème est que le budget de $ < $ min ne reviendra plus vrai, à moins que votre budget de $ est en quelque sorte négatif. 1000 < 0 => retournera false, donc il ne mettra jamais $ min à $ budget. Vous aurez donc besoin de définir une valeur $ min décente. Ce que vous pouvez faire est:

$ min = $ request-> input ('budget', 0);

Cela affectera $ min au paramètre budget dans votre requête, mais si ce paramètre n'existe pas, il sera 0 par défaut.

+0

Le problème est que les utilisateurs peuvent sélectionner plusieurs cases à la fois. Par exemple, je pourrais choisir deux options comme 1000 à 10000 et 10000 à 100000. Ici, la valeur min devrait être 1000 et max sera 100000. Mais mon problème avec la requête est qu'il est toujours mis à 0, peu importe ce que je sélectionner. Oui, vous avez raison, c'est un problème de codage. Depuis que je suis nouveau à Laravel, je trouve difficile, donc, cherchant de l'aide ici. Appréciez tout matériel en ligne pour obtenir de l'aide. Merci encore. – chuck