在Laravel 5中创建一个嵌套的类别列表

时间:2015-08-25 22:21:01

标签: php laravel-5

对Laravel来说相当新,我正在尝试为我的应用创建一个类似树的类别结构。这是我以前使用的代码,但仍然无法实现我想要的。 我的控制器:

public function index()
{
    $categories = Category::with('children')->get();

    return view('backend.categories.index')->with('categories', $categories);
}

我的分类模型:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
    protected $guarded = ['id'];

    public function parent()
    {
        return $this->belongsTo('App\Category', 'parent_id');
    }

    public function children()
    {
        return $this->hasMany('App\Category', 'parent_id');
    }
}

我的观点:

<table class="table table-bordered table-hover">
                <thead>
                    <tr>
                        <th>Name</th>
                        <th>Description</th>
                        <th>Slug</th>
                        <th>Action</th>
                    </tr>
                </thead>
                <tbody>
                @foreach ($categories as $category)
                    {{--@foreach ($category->children as $children)--}}
                    <tr>
                        <td>{{ $category->name }}</td>
                        <td>{{ $category->description }}</td>
                        <td>{{ $category->slug }}</td>
                        <td><a class="edit" href="{!! action('Admin\CategoriesController@edit', $category->id) !!}" title="Edit"><i class="fa fa-pencil-square-o"></a></i> <a class="delete" href="{!! action('Admin\CategoriesController@destroy', $category->id) !!}" title="Are you sure you want to delete?"><i class="fa fa-trash-o"></i></a></td>
                        @foreach ($category->children as $children)
                            <tr>
                                <td>{{ $children->name }}</td>
                                <td>{{ $children->description }}</td>
                                <td>{{ $children->slug }}</td>
                                <td></td>
                            </tr>
                        @endforeach
                    </tr>
                </tbody>
                    {{--@endforeach--}}
                @endforeach
            </table>

我试图制作如下所示的结构:

  • 时尚配饰
  • 手机
    • 片剂
    • 智能

EDIT 有我的数据库结构:

+-------------+------------------+------+-----+---------------------+----------------+
| Field       | Type             | Null | Key | Default             | Extra          |
+-------------+------------------+------+-----+---------------------+----------------+
| id          | int(10) unsigned | NO   | PRI | NULL                | auto_increment |
| name        | varchar(255)     | NO   |     | NULL                |                |
| slug        | varchar(255)     | NO   |     | NULL                |                |
| parent_id   | int(11)          | YES  |     | NULL                |                |
| description | text             | NO   |     | NULL                |                |
| created_at  | timestamp        | NO   |     | 0000-00-00 00:00:00 |                |
| updated_at  | timestamp        | NO   |     | 0000-00-00 00:00:00 |                |
+-------------+------------------+------+-----+---------------------+----------------+

2 个答案:

答案 0 :(得分:1)

您当前正在加载所有类别(包括子类别),然后循环遍历它们。您只想加载根类别(没有父类别的类别)。为此,请将控制器方法更改为仅加载parent_idnull的类别。

$categories = Category::whereNull('parent_id')->with('children')->get();

答案 1 :(得分:0)

可能在模型中你需要改变才能引用儿童模型:

public function children()
    {
        return $this->hasMany('App\Children', 'parent_id');
    }

类别模型:

class Category extends Model
{
    protected $guarded = ['id'];
    protected $fillable = array('name','description','slug','created_at','updated_at');

    public function children()
    {
        return $this->hasMany('App\Children', 'parent_id');
    }
}

儿童模特:

class Children extends Model {
     protected $table = 'children';
     protected $fillable = array('name','description','parent_id','created_at','updated_at');
}

在控制器中获取包含以下子项的类别:

$categories = Category::with(['children'])->get();

并更正标记 - <i class="fa fa-pencil-square-o"></i></a>

然后在视图中:

@foreach ($categories as $category)              
       <ul>
           <li>{{ $category->name }}</li>
           <li>{{ $category->description }}</li>
           <li>{{ $category->slug }}</li>
           <li><a class="edit" href="{!! action('Admin\CategoriesController@edit', $category->id) !!}" title="Edit"><i class="fa fa-pencil-square-o"></i></a> <a class="delete" href="{!! action('Admin\CategoriesController@destroy', $category->id) !!}" title="Are you sure you want to delete?"><i class="fa fa-trash-o"></i></a></li>


               @foreach ($category->children as $children)
                  <ul>
                    <li>{{ $children->name }}</li>
                    <li>{{ $children->description }}</li>
                    <li>{{ $children->slug }}</li>
                    <li></li>
                  </ul>
               @endforeach

       </ul>
@endforeach