2017-02-02 2 views
0

Im Blick habe ich zwei foreach: erste gibt alle Kategorien, die zweite, sollte jede Marke aus aktuelle Kategorie ausgeben.So implementieren Sie eine solche Anfrage an DB

Beispiel:

// Controller 
$categories = DB::table('products') 
       ->join('categories', 'products.c_id', '=', 'categories.id') 
       ->select('categories.name as cat') 
       ->groupBy('categories.name') 
       ->get(); 
$brands = DB::table('products') 
       ->join('categories', 'products.c_id', '=', 'categories.id') 
       ->join('brands', 'products.b_id', '=', 'brands.id') 
       ->select('brands.name as brand') 
       ->where('categories.id', '=', '1')<-- the problem part 
       ->groupBy('brands.name') 
       ->get(); 

//view 
@foreach($categories as $category) 
    <li><a>{{ $category->cat}}</a> 
     <ul class="sort-section"> 
      <li><a href="#"><strong>All {{$category->cat}}</strong></a></li> 
      @foreach($brands as $brand) 
       <li><a href="#">{{ $brand->brand }}</a></li> 
      @endforeach 
     </ul> 
    </li> 
@endforeach 

Ich weiß nicht, wie man es richtig ausgegeben. Im Moment bekomme ich Aufzeichnungen, where categories.id = 1 (ich habe es getan, um zu überprüfen, ob mein Code überhaupt funktioniert), aber anstelle von 1 sollte ich id von aktuellencategory verwenden. Mit anderen Worten, wenn ich es gerne machen würde, egal was passiert, würde ich die zweite Anfrage aus meiner Sicht in foreach implementieren (was verrückt ist).

Irgendwelche Vorschläge?

+0

Nur so verstehe ich die Frage, wollen Sie die Liste der Marken angezeigt werden nur diejenigen, die mit der Auswahl verbunden sind Ed-Kategorie? – Birdman

+0

@Birdman Ja, das ist der schwierigste Teil für mich: Während der ersten 'foreach' bekomme ich Werte von Kategorien. Und für jede Kategorie muss ich verschiedene Marken bekommen. das ist der 'wo' Teil in der zweiten Abfrage – newbie

Antwort

1

Sie können mit nur einer Abfrage tun, wie folgt aus:

// Controller-

$getAll = DB::table('categories') 
        ->leftJoin('products', 'products.c_id', '=', 'categories.id') 
        ->leftJoin('brands', 'brands.id', '=', 'products.b_id') 
        ->groupBy('brands.name') 
        ->groupBy('categories.name') 
        ->get([ 
         'categories.id as id', 
         'categories.name as cat', 
         'brands.name as brand' 
        ]); 

     $categories = []; 
     if (count($getAll)) { 
      foreach ($getAll as $single) { 
       if (!isset($categories[$single->id])) { 
        $categories[$single->id] = new \StdClass(); 
       } 
       $categories[$single->id]->cat = $single->cat; 
       $categories[$single->id]->brands[] = $single->brand; 
      } 
     } 

Dann aus Ihrer Sicht dies tun

+0

Ich bekomme:' Undefinierte Variable: Marken'. Ich habe versucht, in der Controller 'return view ('pages.index', compact (['getAll', 'Kategorien'])) zurückzukehren;' – newbie

+1

1. Sie brauchen $ getAll nicht auf Ihrem Blade, 2. Sie könnten irgendwo verlassen $ Marken geschrieben, in meinem Beispiel gibt es keine Variable mit dem Namen $ Marken, gibt es nur $ Marke –

+0

Duuuudeeeee !! Es klappt. Es beschwerte sich über 'brand', weil das Kommentieren in' blade' bei Laravel nicht funktioniert - meine alte kommentierte Sektion wurde gelöscht und alles funktioniert so flüssig wie es nur geht. Vielen Dank, jetzt kann ich an diesem Wochenende an etwas anderem arbeiten (denn sonst hätte ich daran gearbeitet) – newbie

1

Es gibt zwei verschiedene Möglichkeiten, wie Sie damit umgehen können.

Der erste ist der hässlichere Weg, aber immer noch den Trick. Sie können dies in zwei verschiedene Teile aufteilen. Der Benutzer wählt zuerst die Kategorie aus, die eine Postanforderung sendet, und Sie erfassen dann die Kategorie-ID und fragen dann nur die mit dieser Kategorie verknüpften Marken ab und geben sie zurück. Dies erzwingt das Neuladen einer Seite.

Die zweite ist der sauberere Weg, und es verwendet AJAX. Mit JQuery macht dies einfach, und hier ist eine Antwort, die Ihnen zeigen kann, wie, um loszulegen: Using AJAX

Verwandte Themen