Laravel展示带有子类别的产品

时间:2018-11-22 19:49:03

标签: php laravel

我有带有代码的MainController:

public function index()
{
    $products = Product::with('category')->paginate(15);

    return view('main', compact('products'));
}

在刀片服务器中:

                       <table class="table">
                            <tr>
                                <th class="th-1">Name</h2></th>
                                <th class="th-2">Count <!--<span><i class="fas fa-chevron-up"></i>--></span></th>
                                <th class="th-3">Price <!--<span><i class="fas fa-chevron-up"></i>--></span></th>
                                <th class="th-4">Sales <!--<span><i class="fas fa-chevron-up"></i>--></span></th>
                                <th class="th-5"></th>
                            </tr>
                            {{-- {{ dd($products->groupBy('category_id')) }} --}}

                            @include('products')
                        </table>
        <div class="pagination mt-3">
            {{ $products->links() }}
        </div>

在产品刀片中:

@forelse($products->groupBy('category.title') as $title => $prods)
{{-- @forelse($products as $product) --}}
<tr class="category">
    <td colspan="5">{{ $title }}</td>
</tr>

@foreach($prods as $product)
<tr>
        <td>
            <div class="icon float-left mr-2">
                <span class="{{ $product->category->slug ?? '' }}"><i class="{{ $product->category->icon['font'] ?? 'far fa-file-alt' }}" @isset($product->category->icon['color']) style="color: {{ $product->category->icon['color'] }}" @endisset></i></span>
            </div>
            <p class="mb-0" data-toggle="tooltip" data-placement="top" title="{{ $product->description }}">
                {!! $product->title !!}
            </p>
        </td>
        <td>
            {{ $product->product_count }}
        </td>
        <td>
            @if($product->discount)
                <del class="text-danger">{{ $product->oldPrice }} $.</del>
                {{ $product->price }} $. <span class="text-muted">/ 1 cnt.</span>
            @else
                {{ $product->price }} $. <span class="text-muted">/ 1 cnt.</span>
            @endif
        </td>
        <td>
            {{ $product->sales }}
        </td>
        <td class="text-right">
            <a href="{{ route('showproduct', $product) }}" class="btn btn-success btn-sm">
                <i class="fas fa-arrow-right"></i>
                Readmore
            </a>
        </td>
    </tr>
@endforeach

@empty
<tr>
    <td colspan="5">

            <p>-</p>

    </td>
</tr>
 @endforelse

在模型类别中,我具有关系childrenparent

public function children()
{
    return $this->hasMany(self::class, 'parent_id');
}

public function parent()
{
    return $this->belongsTo(self::class, 'parent_id');
}

public function products()
{
    return $this->hasMany(Product::class);
}

现在我在页面上获得产品:

类别
1.产品1
2.产品2
3.产品3

另一个类别
1.产品1
2.产品2
3.产品3

如何添加孩子并获得结果?

类别
1.产品
2.产品
----- 类别儿童
----- 1.产品
----- 2.产品

另一个类别
1.产品
2.产品
----- 类别儿童
----- 1.产品
----- 2.产品
3.产品

UPDATE

现在我得到了重复项:

类别
1.产品1
2.产品2
3.产品3

另一个类别
1.产品1
2.产品2
3.产品3

如何添加孩子并获得结果?

类别
1.产品
2.产品
----- 类别儿童
----- 1.产品
----- 2.产品

另一个类别
1.产品
2.产品
3.产品

类别儿童
  1.产品
  2.产品

1 个答案:

答案 0 :(得分:0)

您可以通过递归实现此行为。主要思想是在父产品具有子产品时将产品称为部分产品。首先要做的是将所有categories发送到视图,而不是products。因此,在Controller中:

public function index()
{
    $categories = Category::paginate(15);

    return view('main', compact('categories'));
}

然后,在视图中,递归循环类别。这是主要思想:

Products.blade:

//Code...
<h1>List</h1>
@foreach ($categories as $category)
    @include('partial', ['category' => $category])
@endforeach
//Code...

然后您可以创建一个名为partial.blade的文件:

{{ $category->title }}

@foreach ($category->products as $product)
    {!! $product->title !!}
    //Other attributes
@endforeach

@if ($category->children()->count() > 0)
    @foreach ($category->children as $child)
        @include('partial', ['category' => $child])
    @endforeach
@endif

主要思想是在特定类别有子级时调用partial.blade。因此,您再次为每个孩子调用它。