Laravel: нарушение ограничений целостности - PullRequest
0 голосов
/ 09 ноября 2018

Я изучаю некоторые Laravel и в какой-то момент мне пришлось перенастроить базу данных, потому что мне пришлось изменить таблицу. Я использую почтальон для тестирования, и один из методов API выдает ошибку:

SQLSTATE [23000]: нарушение ограничения целостности: 19 Сбой ограничения NOT NULL: events.user_id (SQL: вставить в «events» («sport», «title», «Players», «when», «description», Значения "location", "updated_at", "creation_at") (Хоккей, Грасс Хоккей, 12, 30/09/2018, Присоединяйтесь к нам, Парк Fairview, 2018-11-08 22:19:45, 2018-11-08 22:19:45))

так что, похоже, проблема в events.user_id, который я изменил в таблице с именем Events, чтобы иметь связь с таблицей Users. Некоторые примеры, которые я нашел при исследовании, относятся к полям таблицы, которые не были идентификаторами, поэтому я не знаю, как это выяснить, может быть, некоторые из вас могут мне помочь!

вот миграции для событий и пользователей:

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

Спасибо, ребята!

Edit:

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 голосов
/ 09 ноября 2018

Я думаю, что вы должны добавить 'user_id' к $ fillable класса Event:

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

     public function user()
     {
         return $this->belongsTo('App\User');
     }
}
0 голосов
/ 09 ноября 2018

Вам необходимо передать user_id:

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

В приведенном выше примере требуется аутентифицированный пользователь в сеансе, но если вы делаете запрос с помощью почтальона, у вас, вероятно, его нет.

В любом случае, вам нужно предоставить user_id, который будет храниться в базе данных.

EDIT

Метод Eloquent create копирует в модель только атрибуты, определенные как fillable. Итак, у вас есть два варианта:

  • Добавить user_id к $fillable
  • Используйте newInstance вместо create, вручную установите user_id с помощью $event->user_id = ... и вручную сохраните модель $event с $event->save();
...