laravel模型关系不起作用

laravel模型关系不起作用,laravel,orm,eloquent,many-to-many,Laravel,Orm,Eloquent,Many To Many,我为我的应用程序创建了一个laravel api。我为不同的模块使用了乒乓模块包。我很难建立多对多关系。我有3个表:角色、组、组角色。我的模型是: Group.php 名称空间模块\用户\实体; 使用Illumb\Database\Elount\Model; 类组扩展模型{ 受保护的$fillable=[]; 受保护的$table='groups'; 公共静态函数角色(){ 返回$this->belongTomany('Modules\User\Entities\Role','group\u r

我为我的应用程序创建了一个laravel api。我为不同的模块使用了乒乓模块包。我很难建立多对多关系。我有3个表:
角色、组、组角色
。我的模型是:

Group.php

名称空间模块\用户\实体;
使用Illumb\Database\Elount\Model;
类组扩展模型{
受保护的$fillable=[];
受保护的$table='groups';
公共静态函数角色(){
返回$this->belongTomany('Modules\User\Entities\Role','group\u roles','group\u id','Role\u id');
}
}
Role.php

名称空间模块\用户\实体;
使用Illumb\Database\Elount\Model;
类角色扩展模型{
受保护的$fillable=[];
受保护的$table='roles';
公共职能小组(){
返回$this->belongTomany('Modules\User\Entities\Group','Group\u roles','Group\u id','role\u id');
}
}
还有我的控制器

名称空间模块\User\Http\Controllers;
使用乒乓球\模块\路由\控制器;
使用模块\用户\实体\组;
使用模块\用户\实体\角色;
使用\Http\Request;
使用App\Login;
使用输入;
使用验证器;
使用散列;
使用响应;
类UserController扩展控制器{
公共函数getGroupById(请求$Request){
$groups=Group::with('roles')->get();
返回响应::json([
“状态”=>“正常”,
“组”=>$groups
],200);
}   
}
问题是我无法建立模型之间的关系,getGroupById返回500个内部错误响应$group=group::find($request['id'])返回良好,但不返回相关角色


类似的结构和代码在不使用乒乓球的应用程序上运行良好。

您的关系目前如下:

// not sure why this is static?
public static function roles(){
    return $this->belongsToMany('Modules\User\Entities\Role', 'group_roles', 'group_id', 'role_id');
}

public function groups(){
    return $this->belongsToMany('Modules\User\Entities\Group', 'group_roles', 'group_id', 'role_id');
}
public function roles(){
    return $this->belongsToMany('Modules\User\Entities\Role', 'group_roles', 'group_id', 'role_id');
}

public function groups(){
    return $this->belongsToMany('Modules\User\Entities\Group', 'group_roles', 'role_id', 'group_id');
}
请注意文档中关于
以下方法的说明:

第三个参数是定义关系的模型的外键名,而第四个参数是要加入的模型的外键名

因此,考虑到这一点,我认为您的关系可能是不正确的,因为在
belongToMany
方法调用中使用了错误的参数。我认为应该是这样的:

// not sure why this is static?
public static function roles(){
    return $this->belongsToMany('Modules\User\Entities\Role', 'group_roles', 'group_id', 'role_id');
}

public function groups(){
    return $this->belongsToMany('Modules\User\Entities\Group', 'group_roles', 'group_id', 'role_id');
}
public function roles(){
    return $this->belongsToMany('Modules\User\Entities\Role', 'group_roles', 'group_id', 'role_id');
}

public function groups(){
    return $this->belongsToMany('Modules\User\Entities\Group', 'group_roles', 'role_id', 'group_id');
}
另外,如果您有中间表列,则需要在
belongToMany
调用中声明这些列

希望有帮助

编辑

首先,您说getGroupById返回500个内部错误响应。你试过检查实际的错误是什么吗!?500内部错误没有提供太多信息,我相信如果你通过laravel通常的错误响应页面发现确切的问题,你会更快地找到问题的根源

我假设你是通过一个ajax请求来实现的,所以如果你使用chrome,你可以使用network选项卡,然后点击500请求查看laravel返回的错误,或者你可以使用类似这样的东西并点击url

如果我想快速检查模型关系方法的功能,我会执行以下操作:

在为组和关系设置了一些数据之后,您是否可以尝试在tinker或用于测试/调试的路由中运行它

$g = Group::first(); // get the first group, or you could use find($id) if you had a specific group in mind

// if you're in tinker
$g->roles; // show the roles

// if you're running on a route
dd($g->roles); // show the roles

虽然haakym的回答非常详细,但您也可以尝试将映射表名称更改为基于约定的“组角色”,而不是“组角色”。使用此方法,您只需为BelongToMany调用提供一个参数


请注意,一般来说,其他参数是否正确并不重要,但这只是调试的另一个步骤

好吧,我相信这可能还是个问题。我将用一些提示更新我的答案,以尝试调试。