Laravel Eloquent firstOrNew 未在 "new" 条件下填充属性

Laravel Eloquent firstOrNew not populating attributes on "new" condition

我正式点击这个 -- 我无法理解我做错了什么。

我正在尝试使用 ::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();
    }
}

我的代码基于 This Link from the Docs

如果我在其中添加 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 => "*"
  ]
}

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

之类的错误

SQLSTATE[HY000]: General error: 1364 Field 'segment' doesn't have a default value (SQL: insert into cdw_tagging (updated_at, created_at) values (2017-12-01 22:59:11, 2017-12-01 22:59:11))

我觉得我一定是在尝试使用这种方法的过程中做错了什么,但我一定是累了什么的,因为我想不通什么 .感谢您提供的任何帮助或想法

错误是因为它在您插入时没有为列段发送值。

如果只是为了测试,你在tablecdw_tagging中允许NULL或者为列段设置一个默认值,这行得通吗?

我认为您已将 'segment' 放入第二个参数(即 可选 )。你应该这样做:

['tagging'=>$old_tag, 'segment'=>$tag_section], [ 'value'=>$old_value]

还有一件事...变量 $tag_section 是我在您的代码中看不到的。也许它在段中分配 NULL 值。

参考:https://laravel.com/docs/5.5/eloquent#other-creation-methods

模型的构造函数如下:

public function __construct(array $attributes = [])

需要属性。新实例在创建时可以填充属性,firstOrNew 就是这样。

如果您出于某种奇怪的原因决定不在构造函数中采用这些属性,那么在通过 new Model($attributes).

创建模型实例时,您的属性将不会分配给模型实例

这可能很愚蠢,但我遇到了同样的问题,问题是 fillableguarded 都配置不正确。所以我有这个:

public $fillable = ['*'];

而不是:

protected $guarded = ['id']; 

这就解决了问题。