Laravel Eloquent firstOrNew不会在“新”条件下填充属性

时间:2017-12-01 23:02:00

标签: laravel laravel-5.4 laravel-eloquent

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

我正在尝试使用::firstOrNew检查记录是否存在或为其创建对象实例。问题在于,当我向其传递值 know 不在数据库中时,创建的后续模型绝对没有设置属性。代码看起来有点像这样(修剪一些随机膨胀)

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]:常规错误:1364字段'segment'没有默认值(SQL:插入cdw_taggingupdated_atcreated_at)值(2017- 12-01 22:59:11,2017-12-01 22:59:11))

我觉得我必须在尝试使用这种方法时做错了什么,但我必须感到厌倦或因为我无法弄清楚是什么。感谢您提供任何帮助或想法

4 个答案:

答案 0 :(得分:3)

模型的构造函数如下:

public function __construct(array $attributes = [])

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

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

答案 1 :(得分:0)

错误是因为插入时它不会为列段发送值。

如果仅用于测试,您允许NULL或为表cdw_tagging中的列段设置默认值,它是否有效?

答案 2 :(得分:0)

我认为你已经把分段'在第二个参数中(即可选)。你应该这样做:

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

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

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

答案 3 :(得分:0)

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

public $fillable = ['*'];

代替:

protected $guarded = ['id']; 

这解决了问题。