我为我的应用程序创建了一个laravel api。我使用了Pingpong模块包用于不同的模块。我很难建立多对多关系。我有3个表:roles,groups,group_roles
。我的模型是:
Group.php
namespace Modules\User\Entities;
use Illuminate\Database\Eloquent\Model;
class Group extends Model {
protected $fillable = [];
protected $table='groups';
public static function roles(){
return $this->belongsToMany('Modules\User\Entities\Role','group_roles','group_id','role_id');
}
}
Role.php
namespace Modules\User\Entities;
use Illuminate\Database\Eloquent\Model;
class Role extends Model {
protected $fillable = [];
protected $table='roles';
public function groups(){
return $this->belongsToMany('Modules\User\Entities\Group','group_roles','group_id','role_id');
}
}
我的控制器
namespace Modules\User\Http\Controllers;
use Pingpong\Modules\Routing\Controller;
use Modules\User\Entities\Group;
use Modules\User\Entities\Role;
use Illuminate\Http\Request;
use App\Login;
use Input;
use Validator;
use Hash;
use Response;
class UserController extends Controller {
public function getGroupById(Request $request){
$groups=Group::with('roles')->get();
return Response::json ([
'status'=>'ok',
'group'=>$groups
],200);
}
}
问题是我无法建立模型之间的关系,getGroupById返回500内部错误响应。$group=Group::all(); $group=Group::find($request['id']);
返回正常,但它没有返回相关角色。
类似的结构和代码在没有使用乒乓球的情况下在app上运行良好。
答案 0 :(得分:0)
您的关系目前是这样的:
// 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');
}
请在文档中注明belongsToMany
方法:
第三个参数是您定义关系的模型的外键名称,而第四个参数是您要加入的模型的外键名称...
因此,考虑到这一点,我认为由于在belongsToMany
方法调用中使用了错误的参数,您的关系可能不正确。我认为它应该是这样的:
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');
}
此外,如果您有中间表格列,则需要在belongsToMany
电话上声明这些列。
希望有所帮助!
修改强>
首先,您说getGroupById返回500内部错误响应。你有没有尝试检查实际的错误是什么!? 500内部错误并不能提供太多信息,如果您通过laravel的常见错误响应页面找到确切的问题,我相信您可以更快地找到问题的根源。
我假设您通过ajax请求执行此操作,因此如果您使用chrome,则可以使用网络选项卡,然后单击500请求以查看错误laravel返回,或者您可以使用类似{ {3}}并通过该网址点击。
如果我想快速检查模型关系方法的功能,请执行以下操作:
在为组和关系设置一些数据之后,您可以尝试在修补程序或测试/调试路径中运行它。
$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
答案 1 :(得分:0)
虽然haakym的答案非常详细,但您也可以尝试将映射表名称更改为基于约定的'group_role'而不是'group_roles'。使用此方法,您只需向belongsToMany调用提供一个参数。
请注意,一般来说,其他参数是否正确无关紧要,但它只是另一个调试步骤!