Поле Laravel 5.4 не имеет значения по умолчанию

У меня есть эта ошибка, и ни один из результатов, которые я проверил Google, не похож на мою проблему.

У меня есть приложение с классом Deal, User и Matches

У сделки много матчей. У пользователя много совпадений. У пользователя много сделок.

Я пытаюсь создать новое совпадение, используя объект "Сделки"

$deal->matches()->create(['user_id'=>$id]);

Это мой класс соответствия, я определил все необходимые отношения

class Match extends Model
{
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $guarded = [];
    public $timestamps = false;
    public $expired_on = "";


    public static function boot()
    {
        parent::boot();

        static::creating(function ($model) {
            $model->matched_on = $model->freshTimestamp();
        });
    }

    public function __construct(){
        $d = (new \DateTime($this->matched_on))->modify('+1 day');
        $this->expired_on = $d->format('Y-m-d H:i:s');
    }


    /**
     * Get the user that owns the match.
     */
    public function user()
    {
        return $this->belongsTo('App\User');
    }

    /**
     * Get the deal that owns the match.
     */
    public function deal()
    {
        return $this->belongsTo('App\Deal');
    }
}

И я продолжаю получать эту ошибку, когда я пытаюсь создать новое совпадение.

QueryException в строке Connection.php 647: SQLSTATE [HY000]: Общая ошибка: 1364 Поле 'user_id' не имеет значения по умолчанию (SQL: insert into matches (deal_id) значения (1))

Я хочу, чтобы я был пустым массивом, что может быть проблемой?

Ответ 1

Удалите массив guarded и добавьте fillable вместо этого:

protected $fillable = ['user_id', 'deal_id'];

Ответ 2

Если вы хотите вернуться к предыдущему поведению, обновите

конфигурации/database.php

и установите 'strict' => false для вашего соединения.

Ответ 3

Ответ Алексея Мезенина правильный и хороший.

Другим способом, который я использовал, для тех, кто хочет сохранить защищенный пустой массив, является создание нового объекта Match и добавление атрибутов и сохранение.

            $match->user_id = $id;
            $match->deal_id = $deal->id;
            $match->matched_on = $match->freshTimestamp();
            $match->save();

Ответ 4

Для меня создание поля nullable решило эту проблему.

например

$table->string('user_id')->nullable();

... и перезапуск миграций.

Ответ 5

Поскольку это было уникальное поле в моем случае, я не мог сделать его обнуляемым.

Для меня у меня был пустой конструктор, который вызывал проблему, не знаю почему. Пожалуйста, прокомментируйте, если кто-то знает причину.

public function __construct(){

}

Комментирование/удаление это решило проблему.