2015-08-20 12 views
9

Sử dụng Laravel 5.1, tôi đang cố tạo danh sách menu từ bảng danh mục MySQL. Nhà cung cấp dịch vụ của tôi trả về dữ liệu, nhưng tôi không hiểu cách tạo các danh mục con trong vòng lặp foreach. Khi tôi thực hiện vòng lặp, chỉ có hàng cuối cùng của truy vấn con được trả về. Mọi hướng dẫn sẽ được đánh giá cao.Laravel trả lại con của cha mẹ trong cùng một bảng

loại Bảng

id | cat_name  | cat_parent_id 
--- | --------------| ------------- 
1 | Parent Cat 1 | NULL 
2 | Parent Cat 2 | NULL 
3 | Child Cat 1 | 2 
4 | Child Cat 2 | 2 
5 | Parent Cat 3 | NULL 
6 | Child Cat 3 | 5 

mong muốn Kết quả

Parent Cat 1 
Parent Cat 2 
    Child Cat 1 
    Child Cat 2 
Parent Cat 3 
    Child Cat 3 

viewComposerServiceProvider.php

public function boot() 
{ 
     $this->composeTopCategoryNavigation(); 
     $this->composeSubCategoryNavigation(); 
} 

private function composeTopCategoryNavigation() 
{ 
    view()->composer('partials.header', function($view) 
     { 
      $view->with('top_cats', Category::whereNull('cat_parent_id')->orderBy('cat_name', 'asc')->get()); 
     }); 
} 

private function composeSubCategoryNavigation() 
{ 
     view()->composer('partials.header', function($view) 
     { 
      $view->with('sub_cats', Category::whereNotNull('cat_parent_id')->orderBy('cat_name', 'asc')->get()); 
     }); 
} 

tiêu đề xem

<ul> 
@foreach ($top_cats as $top_cat) 
    <?php $top_cat_slug = str_slug($top_cat->cat_name, "-"); ?> 
    <li>{{ $top_cat->cat_name }} 
    @foreach ($sub_cats as $sub_cat) 
      @if ($sub_cat->cat_parent_id === $top_cat->id) 
       <ul> 
        <li{{ $sub_cat->cat_name }}</li> 
       </ul> 
       @endif 
     @endforeach 
    </li> 
@endforeach 
</ul> 

Trả lời

15

Trước hết, những gì bạn đang làm là không hiệu quả. Chế độ xem của bạn lặp qua tất cả các danh mục phụ cho từng danh mục chính. Nếu bạn đã xác định mối quan hệ đúng cách và sử dụng tải mong muốn của Eloquent, bạn có thể tìm nạp và truy cập các danh mục con theo cách dễ dàng hơn.

Bắt đầu với mối quan hệ xác định:

class Category extends Model { 
    //each category might have one parent 
    public function parent() { 
    return $this->belongsToOne(static::class, 'cat_parent_id'); 
    } 

    //each category might have multiple children 
    public function children() { 
    return $this->hasMany(static::class, 'cat_parent_id')->orderBy('cat_name', 'asc'); 
    } 
} 

Một khi bạn có các mối quan hệ được xác định đúng cách, bạn có thể lấy toàn bộ cây mục như dưới đây:

view()->composer('partials.header', function($view) { 
    $view->with('categories', Category::with('children')->whereNull('cat_parent_id')->orderBy('cat_name', 'asc')->get()); 
}); 

Các nhà soạn nhạc thứ hai sẽ không cần thiết, như các danh mục mẹ đã chứa con.

Bây giờ, bạn chỉ cần để hiển thị các loại theo quan điểm của bạn:

<ul> 
    @foreach ($categories as $parent) 
    <li>{{ $parent->cat_name }} 
     @if ($parent->children->count()) 
     <ul> 
      @foreach ($parent->children as $child) 
      <li>{{ $child->cat_name }}</li> 
      @endforeach 
     </ul> 
     @endif 
    </li> 
    @endforeach 
</ul> 
0

tôi đã tìm thấy các giải pháp bản thân mình. Tôi phải lặp qua các kết quả để có được quyền truy cập vào biến thành viên.

@foreach($locations as $location) 
      <tr> 
       <td> 
        {{$location->location_id}} 
       </td> 
       <td> 
        @foreach($location->members as $member) 
         {{$member->first_name}} 
        @endforeach 
       </td> 
       <td> 

       </td> 
      </tr> 
     @endforeach 
Các vấn đề liên quan