我正式点击这个 - 我无法理解我做错了什么。
我正在尝试使用::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_tagging
(updated_at
,created_at
)值(2017- 12-01 22:59:11,2017-12-01 22:59:11))
我觉得我必须在尝试使用这种方法时做错了什么,但我必须感到厌倦或因为我无法弄清楚是什么。感谢您提供任何帮助或想法
答案 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)
这可能很愚蠢,但是我遇到了同样的问题,问题是fillable
和guarded
的配置都不正确。所以我有这个:
public $fillable = ['*'];
代替:
protected $guarded = ['id'];
这解决了问题。