完整性约束违规:1452无法添加或更新子行:外键约束失败

时间:2017-09-19 15:29:33

标签: mysql laravel foreign-keys

我有用户和项目表。在项目表中,user_id是外键。我创建了一个项目,当我尝试保存项目详细信息时,它显示了这个错误:

SQLSTATE [23000]:完整性约束违规:1452无法添加或更新子行:外键约束失败(labtestprojects,CONSTRAINT projects_user_id_foreign FOREIGN KEY({{ 1}})REFERENCES user_idusers)ON UPDATE CASCADE)(SQL:插入idProjectsnamedescriptiondateupdated_at)值(e,e,2017-12-31,2017-09-19 15:21:06,2017-09-19 15:21:06))

我怎么能解决这个问题?

用户表迁移:

created_at

项目表迁移

Schema::create('users', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->string('email')->unique();
        $table->string('password');
        $table->rememberToken();
        $table->timestamps();
    });

用户模型:

   Schema::create('projects', function (Blueprint $table) {
        $table->increments('id')->unique();
        $table->string('name');
        $table->text('description');
        $table->date('date');
        $table->timestamps('date');
    });



   Schema::table('projects',function(Blueprint $table)
    {
    $table->integer('user_id')->unsigned();
    $table->foreign('user_id')->references('id')->on('users')
    ->onUpdate('cascade');
    });

项目模型:

 public function project()
 {
     return $this->hasMany('App\Project');
  }

控制器:

  public function user() {
      return $this->belongsTo('App\User','id','user_id');
   }

3 个答案:

答案 0 :(得分:0)

在定义项目表时,user_id不可为空。因此,如果您要插入项目,则必须将有效的user_id传递给create()来电。

答案 1 :(得分:0)

您有两种选择:

  • 第一个:

    $data = $request->all();
    $data['user_id'] = Auth::user()->id;
    Project::create($data);
    //....
    
  • 第二个:

    Auth::user()->project()->create($request->all());
    

答案 2 :(得分:0)

您可以让用户使用它来创建项目,如下所示:

$user = auth()->user();
$user->project()->create([
     $request->all()
]);

这样做的好处是你不必把'user_id'直接作为$ fillable。当然,您可能希望将这些(其他)字段添加到模型中的可填写(因为您使用的是create()方法)

观察到的一件事是你的相关模型的复数化,我认为你可以通过使用projects而不是project来避免混淆,因为它的一个用户来自很多项目。