laravel模型关系不起作用

时间:2016-01-25 11:53:55

标签: laravel orm eloquent many-to-many

我为我的应用程序创建了一个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上运行良好。

2 个答案:

答案 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调用提供一个参数。

请注意,一般来说,其他参数是否正确无关紧要,但它只是另一个调试步骤!