【发布时间】:2014-04-18 05:07:26
【问题描述】:
menuitem:
Id int
MenuLevel int
Label varchar(50)
Controller varchar(50)
Action varchar(50)
ParentId int
role:
Id int
Name varchar(50)
menurole:
MenuRoleId int (primary key)
RoleId int (foreign key to Role)
MenuItemId int (foreign key to MenuItem)
我正在尝试检索所有菜单项并将它们显示在表格中,并将每个菜单项具有的所有角色显示为单个表格单元格中的逗号分隔列表。
我的模型:
class MenuItem extends Eloquent
{
protected $table = 'menuitem';
public $timestamps = false;
public function roles()
{
return $this->belongsToMany('Role', 'menurole', 'MenuItemId', 'RoleId');
}
}
class Role extends Eloquent
{
protected $table = 'role';
public $timestamps = false;
public function menuItems()
{
return $this->belongsToMany('MenuItem', 'menurole', 'RoleId', 'MenuItemId');
}
}
为控制器中的视图准备数据的代码如下所示:
$menuItems = MenuItem::all();
在视图中所做的一切都是双 foreach 循环。一个获取所有菜单项,另一个获取每个菜单项的所有角色。
@foreach ($menuItems as $item)
@foreach ($item->roles as $role)
<span>{{ $role->Name }}</span>
@endforeach
@endforeach
问题是没有检索到任何角色。菜单项在那里。重命名 db 列目前不是一个选项。 我做错了什么?
编辑: 在 WAMP 上运行,MySql 版本 5.6.12
【问题讨论】:
-
你有什么错误吗? $item->roles 为 null 或者那里发生了什么?
-
这里是菜单项角色集合之一的 var_dump:object(Illuminate\Database\Eloquent\Collection)#171 (1) { ["items":protected]=> array(0) { } }
-
表示关系已加载,但没有数据。使用 $menuItems->all()->load('roles');然后 dd(DB::getQueryLog());它将向您显示已运行的 2 个查询(第一个用于检索项目,第二个用于角色),您可以通过这种方式检查数据库是否有相关数据。
-
第二个查询:选择
role.*,menurole.MenuItemIdaspivot_MenuItemId,menurole.RoleIdaspivot_RoleIdfromroleinner join @98765433在role.id=menurole.RoleId其中menurole.MenuItemId在 (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 尽管它在第一个查询中选择了菜单项,但在第二个查询中未能获取 MenuItemID -
你试过
$this->belongsToMany('Role', 'menurole', 'RoleId', 'MenuItemId')吗?