Laravel:违反完整性约束

时间:2018-11-08 22:39:53

标签: php laravel postman migrate

我正在研究Laravel,在某个时候我不得不重新迁移数据库,因为我不得不更改表。我使用邮递员进行测试,其中一种api方法给我错误:

SQLSTATE [23000]:违反完整性约束:19 NOT NULL约束失败:events.user_id(SQL:插入“事件”(“ sport”,“ title”,“ players”,“ when”,“ description”, “位置”,“ updated_at”,“ created_at”)值(曲棍球,草地曲棍球,12、30 / 09/2018,快来加入我们,锦绣花园,2018-11-08 22:19:45,2018-11-08 22:19:45))

所以events.user_id似乎有问题,我在名为Events的表上更改为与Users表有关系。我通过研究发现的一些示例是关于非id的表字段的,所以我不知道如何解决这一问题,也许有些人可以帮助我!

这是事件和用户的迁移:

 public function up()
    {
        Schema::create('events', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('user_id')->unsigned();
            $table->foreign('user_id')
                ->references('id')->on('users')
                ->onDelete('cascade');
            $table->string('sport');
            $table->string('title');
            $table->decimal('players', 8, 2);
            $table->date('when');
            $table->mediumText('description');
            $table->string('location');
            $table->timestamps();
        });
    }


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

以下是模型:

class Event extends Model
{
    protected $fillable = [
        'sport',
        'title',
        'players',
        'when',
        'description',
        'location'
    ];

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

class User extends Authenticatable
{
    use HasApiTokens, Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

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

下面是给我错误的api方法:

Route::post('/admin/create-event', function (Request $request) {
    $data = $request->all();

    $event = Event::create(
        [
            'sport' => $data['sport'],
            'title' => $data['title'],
            'players' => $data['players'],
            'when' => $data['when'],
            'description' => $data['description'],
            'location' => $data['location'],
        ]
    );

    return $event;
});

谢谢大家!

编辑:

Route::middleware('auth:api')->post('/admin/create-event', function (Request $request) {
    $user = $request->user();
    $data = $request->all();

    $event = Event::create(
        [
            'user_id' => \Auth::user()->id,
            'sport' => $data['sport'],
            'title' => $data['title'],
            'players' => $data['players'],
            'when' => $data['when'],
            'description' => $data['description'],
            'location' => $data['location'],
        ]
    );

    return $event;
});

2 个答案:

答案 0 :(得分:0)

您需要传递user_id:

'user_id' => \Auth::user()->id

上面的示例在会话中需要经过身份验证的用户,但是如果您使用邮递员发出请求,则可能没有一个。

无论如何,您需要提供将存储在数据库中的user_id。

编辑

Eloquent的方法create仅将定义为fillable的属性复制到模型。因此,您有两种选择:

  • user_id添加到$fillable
  • 使用newInstance代替create,用user_id手动设置$event->user_id = ...,并用$event手动保存$event->save();模型

答案 1 :(得分:0)

我认为您必须将'user_id'添加到Event类的$ fillable中:

class Event extends Model
{
    protected $fillable = [
         'sport',
         'title',
         'players',
         'when',
         'description',
         'location',
         'user_id'
     ];

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