【问题标题】:Laravel: Integrity constraint violationLaravel:违反完整性约束
【发布时间】:2019-04-12 12:30:55
【问题描述】:

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

SQLSTATE[23000]:完整性约束违规:19 NOT NULL 约束失败:events.user_id(SQL:插入“事件”(“运动”、“标题”、“玩家”、“何时”、“描述”、 "location", "updated_at", "created_at") 值 (Hockey, Grass Hockey, 12, 30/09/2018, 加入我们, Fairview park, 2018-11-08 22:19:45, 2018-11-08 22:19:45))

所以这似乎是 events.user_id 的问题,我在名为 Events 的表上更改了它以与 Users 表建立关系。我通过研究发现的一些示例是在不是 ids 的表字段上,所以我不知道如何弄清楚这一点,也许你们中的一些人可以帮助我!

这里是事件和用户的迁移:

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

【问题讨论】:

    标签: php laravel postman migrate


    【解决方案1】:

    你需要传递user_id:

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

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

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

    编辑

    Eloquent 的方法create 只会将定义为fillable 的属性复制到模型中。所以你有两个选择:

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

    【讨论】:

    • 嗨蒂亚戈,谢谢,我正在传递一个用于用户身份验证的令牌,这就是我在重新迁移之前测试的方式。看看我在帖子上所做的编辑,我根据您的建议在更改后添加了方法。这可能不是那么简单,但让我知道它是否有意义!我几乎用以下方法更新了该方法: Route::middleware('auth:api')->post('/admin/create-event', function (Request $request) { $user = $request->user();
    【解决方案2】:

    我认为您必须将“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');
         }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-08-11
      • 1970-01-01
      • 2019-01-02
      • 2017-09-11
      • 2020-06-14
      • 2016-05-25
      • 2020-01-14
      相关资源
      最近更新 更多