2016-07-26 31 views
0

Ich habe einfache Abfrage, die Menü mit Hauptkategorien und Unterkategorien füllen. Diese Arbeit perfektZeige Unterkategorien auf Menü nur, wenn Produkte mit Laravel

// in controller 
$cat=Categories::all(); 
View::share('categories_menu',$cat); 

// in view 
@foreach($categories_menu as $category_menu) 
    @if($category_menu->has('subcategories')) 
     <ul class="nav nav-stacked cat-nav"> 
       <li> 
        <a href="#">{{ $category_menu['category_name'] }} </a> 
         @if($category_menu->subcategories->count()) 
          <ul> 
          @foreach($category_menu->subcategories as $subcategory) 
           <li class=""><a href="#">{{$subcategory->sub_cat_name}}</a></li> 
          @endforeach 
          </ul> 
         @endif 
       </li> 
      @else 
       <li><a href="#"><i class="fa fa-link"></i> <span>{{ $category_menu->category_name }}</span></a></li> 
      @endif 
     </ul> 
@endforeach 

Diese machen eine Ausgabe wie

Main Category 
    -Sub Cat 
    -Sub Cat 
Second main category 
    -Sub in second main category 
    ... 

Das Problem ist, dass es Laden auch Untergruppen ist, die leer sind. Ich will nicht, ihnen zeigen, und ich versuchte, die Abfrage mit dem Beitritt alle drei Tabellen zu ändern - category, sub_categories, products

Dies ist die Abfrage so weit

$cat = Categories::select('*', DB::raw('category.category_id AS category_id')) 
    ->leftJoin('products', function($join) { 
      $join->on('products.category_id', '=', 'category.category_id'); 
      }) 
    ->leftJoin('sub_category', function($secondjoin){ 
      $secondjoin->on('sub_category.category_id', '=', 'category.category_id'); 
      }) 
    ->whereNotNull('products.sub_cat_id') 
    ->get(); 

Das Ergebnis ist seltsam (Bild) enter image description here

Es sollte mir nur zwei Hauptkategorien mit jeweils einem Unter zeigen. Auf dem Bild können Sie meine Produkttabelle

Category 1 
    -sub1 
Category 2 
    -sub3 

enter image description here

Wenn brauchen etwas mehr Quelle oder etwas sehe ich zur Verfügung stellen kann.

-Update mit den Modellen:

Kategorien Modell

class Categories extends Eloquent { 
    protected $table = 'category'; 
    protected $primaryKey = 'category_id'; 

    public $timestamps = false; 

    public function products() 
    { 
     return $this->hasMany('Product', 'category_id'); 

    } 
    public function subcategories() 
    { 
     return $this->hasMany('SubCategories', 'category_id'); 
    } 
} 

Unterkategorien Modell

class SubCategories extends Eloquent { 
    protected $table = 'sub_category'; 
    protected $primaryKey = 'sub_cat_id'; 

    public $timestamps = false; 

    public function category() 
    { 
     return $this->belongsTo('Category', 'category_id'); 
    } 

    public function products() 
    { 
     return $this->hasMany('Product', 'sub_cat_id'); 
    } 
} 

Produkte Modell

class Product extends Eloquent { 
    protected $table = 'products'; 
    protected $primaryKey = 'product_id'; 

    public function categories() 
    { 
     return $this->hasMany('Categories', 'category_id'); 
    } 

    public $timestamps = false; 
} 
+0

Sie sollten sich Eloquant Beziehungen suchen Sie sparen eine Menge Aufwand – Vuldo

+0

Ich habe sie schon .. Art von .. Ich habe gemacht Beziehungen zwischen Tabellen in meinen Modellen.,. –

+0

Können Sie sie in Ihrem Hauptpost hinzufügen? Es wird einfacher sein, dass eine große Abfrage – Vuldo

Antwort

1
@foreach($categories_menu as $category_menu) 
    @if($category_menu->has('subcategories')) 
     <ul class="nav nav-stacked cat-nav"> 
       <li> 
        <a href="#">{{ $category_menu['category_name'] }} </a> 
         @if($category_menu->subcategories->count()) 
          <ul> 
          @foreach($category_menu->subcategories as $subcategory) 
           @if($subcategory->products->count()) 
           <li class=""><a href="#">{{$subcategory->sub_cat_name}}</a></li> 
           @endif 
          @endforeach 
          </ul> 
         @endif 
       </li> 
      @else 
       <li><a href="#"><i class="fa fa-link"></i> <span>{{ $category_menu->category_name }}</span></a></li> 
      @endif 
     </ul> 
@endforeach 

Ich habe eine Bedingung für subcatergy nur angezeigt, wenn ihre Produkte zählen über 0.

+0

Danke. Aber mit welcher Frage? Weil ich das selbe Ergebnis wie das Bild bekomme aber Unterkategorien gibt es mal nicht doppelt wie auf dem Bild –

+0

Ahh habs drauf. Mit der anfänglichen Abfrage '$ cat = Kategorien :: all();' –

+1

Ja mit der anfänglichen Abfrage – Vuldo