laravel一对多插入

时间:2016-02-21 07:44:47

标签: php laravel one-to-many

我有两个型号,用户&角色 我需要从同一表单中插入用户和他的角色

$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');
    });

我认为这是关系正确完成

2 个答案:

答案 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)

此错误,因为您没有为角色表传递u​​ser_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 );