我有两个型号,用户&角色 我需要从同一表单中插入用户和他的角色
$user = new User;
$user ->name = $request ->input('name');
$user ->email = $request ->input ('email');
$user -> password = $request ->input ('pass');
$user ->save();
$role = new Role;
$role ->name = $request ->input('role');
$role ->explain = $request ->input('exp');
$role ->save();
$role ->roles() ->save($user);
它给我一个错误 用户模型
public function roles()
{
# code...
return $this ->hasMany('App\Role');
}
角色模型
public function users()
{
# code...
return $this ->belongsTo('App\User');
}
迁移
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('email')->unique();
$table->string('password', 60);
$table->rememberToken();
$table->timestamps();
});
Schema::create('roles', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id')->unsigned()->index();
$table->text('name');
$table->string('explain');
$table->timestamps();
//cascade
$table->foreign('user_id')->references('id')->on('users')- >onDelete('cascade');
});
我认为这是关系正确完成
答案 0 :(得分:6)
您的问题是您在将Role
与用户关联之前保存了它。由于您没有将其与用户关联,因此您的roles.user_id
字段为空,并且违反了您的外键。
在保存角色之前,您需要更改代码以关联用户,如下所示:
// create the user
$user = new User;
$user->name = $request->input('name');
$user->email = $request->input ('email');
$user->password = $request->input ('pass');
$user->save();
$role = new Role;
$role->name = $request->input('role');
$role->explain = $request->input('exp');
// option 1:
// this will set the user_id on the role, and then save the role to the db
$user->roles()->save($role);
// option 2:
// associate the user to the role (sets the user_id field)
// then you need to save your role
$role->users()->associate($user);
$role->save();
使用选项1或选项2,而不是两者。
此外,未传入时,belongsTo
关系会根据关系函数的名称构建外键。由于您的方法名为users
,因此它会查找users_id
字段,这是不正确的。您需要将正确的外键名称作为第二个参数传递,或者将关系方法从users()
重命名为user()
。
// option 1
// pass in the foreign key field as the second parameter
public function users()
{
return $this->belongsTo('App\User', 'user_id');
}
// option 2
// rename the relationship to user
public function user()
{
return $this->belongsTo('App\User');
}
你可以做到这两点,但至少,如果你要将方法重命名为user()
,它会使代码更符合逻辑。
答案 1 :(得分:2)
此错误,因为您没有为角色表传递user_id。它是此表中的外键,必须通过。 你可以用这种方式保存你的一对多关系表:
https://laravel.com/docs/4.2/eloquent#inserting-related-models
首先保存主表用户行,然后按find()
方法保存角色表中的所有详细信息行,如链接示例。
$role = new Role(array('','','','')); // array of roles row values you want save
$user = User::find(1); // where 1 is id
$role = $user->roles()->save($role );