[英]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.