【问题标题】:Laravel 5.4 field doesn't have a default valueLaravel 5.4 字段没有默认值
【发布时间】:2017-08-28 10:21:05
【问题描述】:

我遇到了这个错误,我检查的谷歌搜索结果都没有与我的问题相似。

我有一个包含 Deal、User 和 Matches 类的应用程序

一笔交易有很多匹配项。 一个用户有很多匹配项。 一个用户有很多交易。

我正在尝试使用我的 Deal 对象创建一个新的匹配

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

当我尝试创建新匹配时,我不断收到此错误。

Connection.php 第 647 行中的 QueryException: SQLSTATE[HY000]:一般错误:1364 字段'user_id'没有默认值(SQL:插入matchesdeal_id)值(1))

我的守卫是一个空数组,可能是什么问题?

【问题讨论】:

  • 我不明白为什么matches有一个模型类,如果它是一个数据透视表laravel.com/docs/5.0/eloquent#working-with-pivot-tables
  • 这通常是在您不插入某个不能为NULL或没有默认值的字段时生成的。所以你的'user_id'不会被插入
  • @Cr1xus,是的,我的 'user_id' 没有被插入,我现在的问题是为什么会这样,因为我的 create 方法中有它。

标签: php mysql laravel laravel-5.4


【解决方案1】:

删除 guarded 数组并添加 fillable 代替:

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

【讨论】:

  • 会这样做,但根据文档使用 guarded 没有任何问题
  • 'guarded' 则相反(如 $guarded = ['id']; 表示不允许更新 id),因此,您应该使用 'fillable' 或 'guarded'。
【解决方案2】:

Alexey Mezenin 的答案是正确的,而且很好。

我使用的另一种方法是,对于那些想要维护受保护的空数组的人来说,创建一个新的 Match 对象并放入属性并保存。

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

【讨论】:

    【解决方案3】:

    如果您想恢复以前的行为,请更新您的

    config/database.php

    为您的连接归档并设置'strict' => false

    【讨论】:

    • 您需要运行任何工匠清除命令,还是在此之后刷新迁移?
    • 在 Laravel 5.5 php artisan migrate:fresh --seed 中使用新命令并玩得开心 :)
    • 谢谢。那么,您说它确实需要重新运行迁移吗?作为记录,我认为是php artisan migrate:refresh --seed。除非有新鲜的我不知道。 ;-)
    • 是的,我做到了,它成功了,migrate:fresh 是 laravel-news.com/laravel-5-5 的新命令外观
    【解决方案4】:

    由于在我的情况下它是一个唯一字段,因此我无法将其设为可空。

    对我来说,我有一个空的构造函数,导致问题不知道为什么。 如果有人知道原因,请发表评论。

    public function __construct(){
    
    }
    

    评论/删除它解决了这个问题。

    【讨论】:

    • 可以确认这是一件事。我也刚碰到它。我删除了空的构造函数类,“字段没有默认值”错误消失了。
    • @vivek-takrani 请参阅davee44's answer 了解原因。显然,这些字段通过构造函数传递给父级。使用参数调用父构造函数解决了我的问题。
    • 已确认。需要调用父构造函数!并传递属性:stackoverflow.com/a/59866152/3163536
    • 已确认。类中的空构造函数是问题所在。
    【解决方案5】:

    如果您的模型中有构造函数,只需确保它也调用了父构造函数:

    public function __construct( array $attributes = array() ) {
        // mandatory
        parent::__construct($attributes);
    
        //..
    }
    

    否则会破坏Model::create等一些功能。

    【讨论】:

    • 这解决了我的问题
    • 我在这个问题上花了很长时间,在我尝试这个之前没有任何帮助。
    【解决方案6】:

    解决此错误的另一种方法是包含

    '严格' => 假,

    进入mysql数组中的config/database.php

    【讨论】:

      【解决方案7】:

      我正在使用 Laravel 8 并通过以下两个步骤修复了此错误:

      1. 在用户模式下将单词从$guarded 数组移动到$fillable 数组

      2. Config.database.php:'strict' => false'mysql'的数组中

      【讨论】:

        【解决方案8】:

        手动导入/导出数据库时,检查所有表设置是否传输成功。如果您忘记添加自增主键,Laravel 不会为您填充该值。

        之后添加AUTO_INCREMENT 即可解决问题。

        【讨论】:

          【解决方案9】:

          我有这个错误,但我的错误是制作类模型:

          $book = new Book();
          

          这是真的

          $book = new Book($request->all());
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-06-29
            • 2017-09-06
            • 2021-01-05
            • 2021-07-21
            相关资源
            最近更新 更多