我如何使一个对多个关系到同一个表在Laravel 5


How do I make one to many relationship to same table in Laravel 5?

我有一个名为菜单的表。我想检索菜单及其子菜单。但是只有父菜单被检索。子菜单结果为空数组。我的表结构是:id | parent_id | name。我的菜单模型一对多关系是:

public function childMenus() { 
    return $this->hasMany( ‘App'Menu’, ’parent_id’); 
} 
public function parentMenus() {
    return $this->belongsTo(‘App'Menu’, ‘parent_id’); 
}  

My controller Method:

public function index() 
{ 
    $menu = new Menu;
    $parent_menus = $menu->where('parent_id', NULL)->get();
    $sub_menus = $menu->childMenus()->get(); 
    return View('admin',compact('$parent_menus’, ‘sub_menus’); 
}

当我潜水转储sub_menus dd($sub_menus)时,它返回一个空数组。请任何人帮忙。

您正在为新创建的Menu对象获取childMenus关系,该对象存储在$ Menu变量中,没有任何相关的子菜单,而您应该为已经存在于数据库中的父菜单获取childlmenus

用子菜单加载父菜单的最简单方法是执行以下操作(注意,不需要创建新的Menu对象):

$parent_menus = Menu::with('childMenus')->where('parent_id', NULL)->get();

$parent_menus现在将存储所有父菜单的集合,并且每个父菜单都有其子菜单存储在childMenus变量中。您可以使用以下命令迭代父菜单和子菜单:

foreach ($parent_menus as $parent) {
  foreach ($parent->childMenus as $child) {
    //do whatever you need with the child menu
  }
}

如果你想要的只是所有子菜单的集合,不管他们有什么父菜单,只要:

$child_menus = Menu::whereNotNull('parent_id')->get();