【问题标题】:laravel eloquent, many to many, custom column names, what am I doing wronglaravel 雄辩,多对多,自定义列名,我做错了什么
【发布时间】: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.MenuItemId as pivot_MenuItemId, menurole.RoleId as pivot_RoleId from roleinner join @98765433在role.id = menurole.RoleId 其中menurole.MenuItemId 在 (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 尽管它在第一个查询中选择了菜单项,但在第二个查询中未能获取 MenuItemID
  • 你试过$this-&gt;belongsToMany('Role', 'menurole', 'RoleId', 'MenuItemId')吗?

标签: laravel eloquent


【解决方案1】:

问题在于正确设置模型中的主键..

每个模型都需要这个和相关的键名。

public $primaryKey = 'primarykeyname'

此外,适当的 eagler 加载方法是像这样使用它...

$menuItems = MenuItem::with('role')->get();

【讨论】:

    【解决方案2】:

    尝试使用eager loading 加载关系。

    $menuItems = MenuItem::with('role')->get();
    

    【讨论】:

    • 得到:调用未定义的方法 Illuminate\Database\Eloquent\Collection::with() 我现在就看链接,谢谢
    • 只是$menuItems = MenuItem::with('role')-&gt;get();。此外,您还需要在模型中设置主键。为每个模型添加带有适当主键名称的public $primaryKey = 'primarykeyname'。
    • @user3158900 请将评论转换为答案或其他内容,以便我接受。做到了。非常感谢。
    猜你喜欢
    • 2020-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    • 2023-04-03
    • 2018-03-28
    • 2016-11-03
    • 2013-01-22
    相关资源
    最近更新 更多