对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 | |
+-------------+------------------+------+-----+---------------------+----------------+
答案 0 :(得分:1)
您当前正在加载所有类别(包括子类别),然后循环遍历它们。您只想加载根类别(没有父类别的类别)。为此,请将控制器方法更改为仅加载parent_id
为null
的类别。
$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