2016-07-26 3 views
0

У меня есть простой запрос, который заполняет меню основными категориями и подкатегориями. Эта работа отличноОтображение подкатегорий в меню, только если есть продукты с 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 

Это делают выход как

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

Проблема в том, что нагрузка также подкатегорий, которые пусты. Я не хочу, чтобы показать им, и я попытался изменить запрос с соединением всех трех таблиц - category, sub_categories, products

Это вопрос до сих пор

$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(); 

В результате странно (изображение) enter image description here

Это должно показать мне только две основные категории, каждая из которых имеет один подканал. На изображении вы можете увидеть мой стол продукт

Category 1 
    -sub1 
Category 2 
    -sub3 

enter image description here

Если нужно больше какого-то источника или что-то я могу предоставить.

Обновление с моделями:

Категория модель

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'); 
    } 
} 

Подкатегория модель

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'); 
    } 
} 

Продукция модель

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

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

    public $timestamps = false; 
} 
+0

Вы должны посмотреть на отношения с Eloquant, которые вы сэкономите много сил. – Vuldo

+0

У меня их уже есть .. вроде .. отношения между таблицами в моих моделях. –

+0

Можете вы добавить их в свой главный пост? Будет проще сделать огромный запрос – Vuldo

ответ

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 

Я добавил условие для отображения subcatergy только в том случае, если их количество продуктов превышает 0.

+0

Спасибо. Но с каким запросом? Потому что я получаю тот же результат, что и изображение, но подкатегории есть один раз, а не два раза, как на изображении. –

+0

Ahh получил его. С начальным запросом '$ cat = Категории :: all();' –

+1

Да с исходным запросом – Vuldo

Смежные вопросы