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)
.
创建模型实例时,您的属性将不会分配给模型实例
这可能很愚蠢,但我遇到了同样的问题,问题是 fillable
和 guarded
都配置不正确。所以我有这个:
public $fillable = ['*'];
而不是:
protected $guarded = ['id'];
这就解决了问题。
我正式点击这个 -- 我无法理解我做错了什么。
我正在尝试使用 ::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)
.
这可能很愚蠢,但我遇到了同样的问题,问题是 fillable
和 guarded
都配置不正确。所以我有这个:
public $fillable = ['*'];
而不是:
protected $guarded = ['id'];
这就解决了问题。