简体   繁体   English

我无法填写数据透视表

[英]I can't fill pivot table

Hy guys, I have a project where I use Angular 5 for front-end and Laravel 5.5 for back-end (api-only). 大家好,我有一个项目,我在前端使用Angular 5,在后端使用Laravel 5.5(仅限api)。 I have to pass a series of permissions to associate with a role I'm creating in that moment. 我必须传递一系列权限才能与当时正在创建的角色相关联。 The permissions are obtained by an http request. 权限是通过http请求获得的。 ng-select shows the permissions to choose (var permissions) and permissions choosen are saved in another variable (var selected). ng-select显示选择权限(变量权限),选择的权限保存在另一个变量中(选择的变量)。 This is the form I use to create the role: 这是我用来创建角色的表单:

<form role="form">
    <div class="form-group row">
      <label for="name" class="col-md-3 col-form-label">Name</label>
      <input type="text" id="name" name="name" class="col-md-9 form-control" placeholder="Name" [(ngModel)]="name">
    </div>
    <div class="form-group row">
      <label class="col-md-3 col-form-label">Permission</label>
      <div class="col-md-9 spaces">
        <ng-select
          [items]="permissions"
          [multiple]="true"
          [closeOnSelect]="false"
          [hideSelected]="true"
          name="permissions"
          bindLabel="name"
          placeholder="Select Permissions"
          [(ngModel)]="selected">
        </ng-select>
      </div>
    </div>

    <div class="form-group row">
      <button type="button" class="btn success" (click)="newRole()">Submit</button>
    </div>
  </form>

These are my ts and my service call: 这些是我的服务和电话:

//ts
newRole(){
  this.admin.newRole(this.name, this.selected).subscribe(
    result => {
      console.log(result);
    }
  )
}

//service call
newRole(name, permissions) {
let headers = new HttpHeaders().set('Accept', 'application/json').append('Authorization', 'Bearer '+ sessionStorage.getItem('token'));

return this.http
  .post(environment.apiUrl + "/api/admin/newRole", {
    name: name,
    permissions: permissions
  }, {
    headers: headers
  })

} }

The 2 tables (permissions and roles) have a many-to-many relationship I've done this role model: 这两个表(权限和角色)具有多对多关系,我已经完成了此角色模型:

class AdminRole extends Model
{
  /**
  * The attributes that are mass assignable.
  *
  * @var array
  */
 protected $fillable = [
   'name',
 ];

 protected $hidden = [

 ];

 public function users() {
   $this->belongsToMany('App\Models\AdminUser', 'admin_role_admin_user', 'role_id', 'user_id')->withTimestamps();
 }

 public function permissions() {
   $this->belongsToMany('App\Models\AdminPermission', 'admin_permission_admin_role', 'role_id', 'permission_id')->withTimestamps();
 }
}

and this permission model: 和此权限模型:

class AdminPermission extends Model
{
  /**
  * The attributes that are mass assignable.
  *
  * @var array
  */
 protected $fillable = [
   'name', 'http_method', 'http_path',
 ];

 /**
  * The attributes that should be hidden for arrays.
  *
  * @var array
  */
 protected $hidden = [

 ];

 public function users() {
   $this->belongsToMany('App\Models\AdminUser', 'admin_permission_admin_user', 'permission_id', 'user_id')->withTimestamps();
 }

 public function roles() {
   $this->belongsToMany('App\Models\AdminRole', 'admin_permission_admin_role', 'permission_id', 'role_id')->withTimestamps();
 }
}

This is my response in AdminController.php: 这是我在AdminController.php中的响应:

class AdminController extends Controller{

  public function newRole(Request $request){
    $input = $request->all();
    $id = AdminRole::create($input)->id;
    $role = AdminRole::find($id);

    $permissions = $input['permissions'];
    $role->permissions()->saveMany($permissions);

    return response()->json(['success'=>'Done'], $this->successStatus);
 }
}

and this is my file api.php: 这是我的文件api.php:

Route::post('login', 'AuthController@login');
Route::post('register', 'AuthController@register');

Route::group(['middleware' => 'auth:api'], function(){

  Route::get('profile', 'AuthController@profile');

  Route::prefix('admin')->group(function (){
    Route::get('/getPermissionsList', 'Admin\AdminController@getPermissionsList');
    Route::post('/newPermission', 'Admin\AdminController@newPermission');
    Route::get('/getRolesList', 'Admin\AdminController@getRolesList');
    Route::post('/newRole', 'Admin\AdminController@newRole');
  });

  Route::get('logout', 'AuthController@logout');
});

When I try the service, this is the response: 当我尝试该服务时,这是响应:

点击这里查看错误

How can I solve this problem? 我怎么解决这个问题?

EDIT 1: this is my last server log: 编辑1:这是我的最后一个服务器日志:

[2018-04-17 08:42:22] local.ERROR: Call to a member function saveMany() on null {"userId":1,"email":"myemail@gmail.com","exception":"[object] (Symfony\\Component\\Debug\\Exception\\FatalThrowableError(code: 0): Call to a member function saveMany() on null at C:\\Users\\ADMIN\\Documents\\myproject\\app\\Http\\Controllers\\Admin\\AdminController.php:113)
[stacktrace]
#0 [internal function]: App\\Http\\Controllers\\Admin\\AdminController->newRole(Object(Illuminate\\Http\\Request))
#1 C:\\Users\\ADMIN\\Documents\\myproject\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Controller.php(54): call_user_func_array(Array, Array)
#2 C:\\Users\\ADMIN\\Documents\\myproject\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\ControllerDispatcher.php(45): Illuminate\\Routing\\Controller->callAction('newRole', Array)
#3 C:\\Users\\ADMIN\\Documents\\myproject\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Route.php(212): Illuminate\\Routing\\ControllerDispatcher->dispatch(Object(Illuminate\\Routing\\Route), Object(App\\Http\\Controllers\\Admin\\AdminController), 'newRole')
#4 C:\\Users\\ADMIN\\Documents\\myproject\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Route.php(169): Illuminate\\Routing\\Route->runController()
#5 C:\\Users\\ADMIN\\Documents\\myproject\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php(659): Illuminate\\Routing\\Route->run()
#6 C:\\Users\\ADMIN\\Documents\\myproject\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Pipeline.php(30): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#7 C:\\Users\\ADMIN\\Documents\\myproject\\vendor\\barryvdh\\laravel-cors\\src\\HandleCors.php(58): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#8 C:\\Users\\ADMIN\\Documents\\myproject\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(149): Barryvdh\\Cors\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#9 C:\\Users\\ADMIN\\Documents\\myproject\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#10 C:\\Users\\ADMIN\\Documents\\myproject\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Middleware\\SubstituteBindings.php(41): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#11 C:\\Users\\ADMIN\\Documents\\myproject\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(149): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#12 C:\\Users\\ADMIN\\Documents\\myproject\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#13 C:\\Users\\ADMIN\\Documents\\myproject\\vendor\\laravel\\framework\\src\\Illuminate\\Auth\\Middleware\\Authenticate.php(43): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#14 C:\\Users\\ADMIN\\Documents\\myproject\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(149): Illuminate\\Auth\\Middleware\\Authenticate->handle(Object(Illuminate\\Http\\Request), Object(Closure), 'api')
#15 C:\\Users\\ADMIN\\Documents\\myproject\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#16 C:\\Users\\ADMIN\\Documents\\myproject\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Middleware\\ThrottleRequests.php(57): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#17 C:\\Users\\ADMIN\\Documents\\myproject\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(149): Illuminate\\Routing\\Middleware\\ThrottleRequests->handle(Object(Illuminate\\Http\\Request), Object(Closure), 60, '1')
#18 C:\\Users\\ADMIN\\Documents\\myproject\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#19 C:\\Users\\ADMIN\\Documents\\myproject\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(102): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#20 C:\\Users\\ADMIN\\Documents\\myproject\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php(661): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))
#21 C:\\Users\\ADMIN\\Documents\\myproject\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php(636): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request))
#22 C:\\Users\\ADMIN\\Documents\\myproject\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php(602): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route))
#23 C:\\Users\\ADMIN\\Documents\\myproject\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php(591): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request))
#24 C:\\Users\\ADMIN\\Documents\\myproject\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Kernel.php(176): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request))
#25 C:\\Users\\ADMIN\\Documents\\myproject\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Pipeline.php(30): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request))
#26 C:\\Users\\ADMIN\\Documents\\myproject\\vendor\\fideloper\\proxy\\src\\TrustProxies.php(57): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#27 C:\\Users\\ADMIN\\Documents\\myproject\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(149): Fideloper\\Proxy\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#28 C:\\Users\\ADMIN\\Documents\\myproject\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#29 C:\\Users\\ADMIN\\Documents\\myproject\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest.php(30): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#30 C:\\Users\\ADMIN\\Documents\\myproject\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(149): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#31 C:\\Users\\ADMIN\\Documents\\myproject\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#32 C:\\Users\\ADMIN\\Documents\\myproject\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest.php(30): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#33 C:\\Users\\ADMIN\\Documents\\myproject\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(149): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#34 C:\\Users\\ADMIN\\Documents\\myproject\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#35 C:\\Users\\ADMIN\\Documents\\myproject\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize.php(27): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#36 C:\\Users\\ADMIN\\Documents\\myproject\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(149): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#37 C:\\Users\\ADMIN\\Documents\\myproject\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#38 C:\\Users\\ADMIN\\Documents\\myproject\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\CheckForMaintenanceMode.php(46): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#39 C:\\Users\\ADMIN\\Documents\\myproject\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(149): Illuminate\\Foundation\\Http\\Middleware\\CheckForMaintenanceMode->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#40 C:\\Users\\ADMIN\\Documents\\myproject\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#41 C:\\Users\\ADMIN\\Documents\\myproject\\vendor\\barryvdh\\laravel-cors\\src\\HandlePreflight.php(35): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#42 C:\\Users\\ADMIN\\Documents\\myproject\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(149): Barryvdh\\Cors\\HandlePreflight->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#43 C:\\Users\\ADMIN\\Documents\\myproject\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#44 C:\\Users\\ADMIN\\Documents\\myproject\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(102): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#45 C:\\Users\\ADMIN\\Documents\\myproject\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Kernel.php(151): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))
#46 C:\\Users\\ADMIN\\Documents\\myproject\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Kernel.php(116): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request))
#47 C:\\Users\\ADMIN\\Documents\\myproject\\public\\index.php(55): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request))
#48 C:\\Users\\ADMIN\\Documents\\myproject\\server.php(21): require_once('C:\\\\Users\\\\ADMIN\\\\...')
#49 {main}
"} 

EDIT 2: This is my pivot table I created thanks to laracast/generators: 编辑2:这是我创建的数据透视表,这要感谢laracast / generators:

class CreateAdminPermissionAdminRolePivotTable extends Migration
{
  /**
   * Run the migrations.
   *
   * @return void
   */
  public function up()
  {
    Schema::create('admin_permission_admin_role', function (Blueprint $table) {
        $table->integer('permission_id')->unsigned()->index();
        $table->foreign('permission_id')->references('id')->on('admin_permissions')->onDelete('cascade');
        $table->integer('role_id')->unsigned()->index();
        $table->foreign('role_id')->references('id')->on('admin_roles')->onDelete('cascade');
        $table->primary(['permission_id', 'role_id']);
        $table->timestamps();
    });
  }

  /**
   * Reverse the migrations.
   *
   * @return void
   */
  public function down()
  {
    Schema::drop('admin_permission_admin_role');
  }
}

The error message describes your problem: 错误消息描述了您的问题:

Call to a member function saveMany() on null 在null上调用成员函数saveMany()

$role->permissions() (AdminController.php line 113) for some reason returns NULL and calling ->saveMany() on that afterwards results in the error you get. $role->permissions() (AdminController.php第113行)由于某种原因返回NULL然后调用->saveMany()会导致错误。

Most likely the error is in your AdminRole model in the permissions() function: 该错误最有可能是在您的AdminRole模型中的permissions()函数中:

$this->belongsToMany('App\\Models\\AdminPermission', 'admin_permission_admin_role', 'role_id', 'permission_id')->withTimestamps();

Verify that the relationships uses the correct keys. 验证关系使用正确的密钥。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM