Laravel雄辩的firstOrNew在“新”条件下不填充属性

Jhe*_*cht 1 laravel laravel-eloquent laravel-5.4

我正式使用了此功能-我无法全神贯注于我做错了什么。

我试图用来::firstOrNew检查记录的存在或为其创建对象实例。问题是,当我值传递给它,我知道是不是在数据库中,创建的后续机型绝对没有的属性设置就可以了。代码看起来像这样(修剪掉一些随机膨胀)

if($old_value != ''){
    list($old_tag, $oldV) = explode(':', $old_value);
    list($new_tag, $value) = explode(':', $new_value);
    //Get the new tag / old tag, new value / old value

    $tag = CdwTagging::firstOrNew(['tagging'=>$old_tag], [ 'value'=>$old_value, 'segment'=>$tag_section]);

    if(!$tag->exists) {
       //do some logical stuff based on other values, etc.
       $tag->save();
    }
}
Run Code Online (Sandbox Code Playgroud)

我的代码基于Docs的This Link

如果我在其中添加dd($tag)我的输出是:

我检查了一下我使用的数组是否真正保存了值(例如:也许我在收集数据时搞砸了),并且可以向您保证这些值正是通过表单发送的。

CdwTagging {#320
  #table: "cdw_tagging"
  #fillable: array:3 [
    0 => "segment"
    1 => "tagging"
    2 => "value"
  ]
  #connection: "mysql"
  #primaryKey: "id"
  #keyType: "int"
  +incrementing: true
  #with: []
  #withCount: []
  #perPage: 15
  +exists: false
  +wasRecentlyCreated: false
  #attributes: []
  #original: []
  #casts: []
  #dates: []
  #dateFormat: null
  #appends: []
  #events: []
  #observables: []
  #relations: []
  #touches: []
  +timestamps: true
  #hidden: []
  #visible: []
  #guarded: array:1 [
    0 => "*"
  ]
}
Run Code Online (Sandbox Code Playgroud)

如果我忽略了它并说“好吧,也许是因为它是新的,它还没有显示属性”,然后->save()无论如何都调用该方法,我会收到诸如以下的错误

SQLSTATE [HY000]:常规错误:1364字段“段”不具有默认值(SQL:插入到cdw_taggingupdated_atcreated_at)的值(2017年12月1日22时59分11秒,2017年12月1日22点59分: 11))

我觉得我在尝试使用此方法时一定做错了事,但是我必须很累或其他事情,因为我无法弄清楚是什么。感谢您的帮助或想法

lag*_*box 5

模型的构造函数如下:

public function __construct(array $attributes = [])
Run Code Online (Sandbox Code Playgroud)

它具有属性。新实例在创建时可以填充属性,这就是发生的情况firstOrNew

如果出于某种奇怪的原因决定不在构造函数中使用这些属性,那么当通过创建实例时,将不会将其分配给模型实例new Model($attributes)