在 Laravel 6 中,保护属性的分析
1、在 Laravel 6 中,执行 updateOrCreate 方法,以更新现有模型或在不存在的情况下则创建新的模型。最后生成的 SQL 如下,缺少字段 checksum。如图1
insert into
`table` (
`asset_key`,
`theme_id`,
`mime_type`,
`created_at`,
`updated_at`,
`content`,
`schema`,
`category`
)
values
(
'apps/internal/back-top/app.json',
'989925b6-58d3-4fee-a50f-8cd084462bf6',
'application/json',
'2023-03-03 09:21:47',
'2023-03-03 09:21:47',
'{\n \"title\": \"回到顶部\",\n \"description\": \"为页面增加返回到页面顶部的按钮,提高用户体验。\"\n}\n',
null,
'unknown'
)
2、代码实现如下:
$predicate = [ 'asset_key' => $to.$view['asset_key'], 'theme_id' => $themeId, ]; $extra = [ 'mime_type' => $view['mime_type'], 'created_at' => $view['modified_at'], 'updated_at' => $view['modified_at'], 'content' => $content, 'schema' => $schema, 'checksum' => $checksum, 'category' => $category ]; ThemeAsset::updateOrCreate( $predicate, $extra );
3、打印变量 $extra,确定其中的字段 checksum 不为 null,说明并不是因为其值为 null 则在 SQL 语句中省略了字段 checksum。如图2
array(7) {
["mime_type"]=>
string(16) "application/json"
["created_at"]=>
object(Illuminate\Support\Carbon)#6487 (19) {
["endOfTime":protected]=>
bool(false)
["startOfTime":protected]=>
bool(false)
["constructedObjectId":protected]=>
string(32) "000000004ec81aa8000000003e76cedb"
["localMonthsOverflow":protected]=>
NULL
["localYearsOverflow":protected]=>
NULL
["localStrictModeEnabled":protected]=>
NULL
["localHumanDiffOptions":protected]=>
NULL
["localToStringFormat":protected]=>
NULL
["localSerializer":protected]=>
NULL
["localMacros":protected]=>
NULL
["localGenericMacros":protected]=>
NULL
["localFormatFunction":protected]=>
NULL
["localTranslator":protected]=>
NULL
["dumpProperties":protected]=>
array(3) {
[0]=>
string(4) "date"
[1]=>
string(13) "timezone_type"
[2]=>
string(8) "timezone"
}
["dumpLocale":protected]=>
NULL
["dumpDateProperties":protected]=>
NULL
["date"]=>
string(26) "2023-03-03 09:53:51.598327"
["timezone_type"]=>
int(3)
["timezone"]=>
string(3) "UTC"
}
["updated_at"]=>
object(Illuminate\Support\Carbon)#6487 (19) {
["endOfTime":protected]=>
bool(false)
["startOfTime":protected]=>
bool(false)
["constructedObjectId":protected]=>
string(32) "000000004ec81aa8000000003e76cedb"
["localMonthsOverflow":protected]=>
NULL
["localYearsOverflow":protected]=>
NULL
["localStrictModeEnabled":protected]=>
NULL
["localHumanDiffOptions":protected]=>
NULL
["localToStringFormat":protected]=>
NULL
["localSerializer":protected]=>
NULL
["localMacros":protected]=>
NULL
["localGenericMacros":protected]=>
NULL
["localFormatFunction":protected]=>
NULL
["localTranslator":protected]=>
NULL
["dumpProperties":protected]=>
array(3) {
[0]=>
string(4) "date"
[1]=>
string(13) "timezone_type"
[2]=>
string(8) "timezone"
}
["dumpLocale":protected]=>
NULL
["dumpDateProperties":protected]=>
NULL
["date"]=>
string(26) "2023-03-03 09:53:51.598327"
["timezone_type"]=>
int(3)
["timezone"]=>
string(3) "UTC"
}
["content"]=>
string(120) "{
"title": "回到顶部",
"description": "为页面增加返回到页面顶部的按钮,提高用户体验。"
}
"
["schema"]=>
NULL
["checksum"]=>
string(40) "2a0fe2215b02b5738926ff93cde566d43ad8188e"
["category"]=>
string(7) "unknown"
}
4、编辑模型,在 $fillable 属性中添加 checksum。最后生成的 SQL 符合预期,字段 checksum 的值已经被插入。如图3
protected $fillable = [
'asset_key',
'theme_id',
'content',
'mime_type',
'created_at',
'updated_at',
'category',
'checksum',
'schema'
];
insert into
`table` (
`asset_key`,
`theme_id`,
`mime_type`,
`created_at`,
`updated_at`,
`content`,
`schema`,
`checksum`,
`category`
)
values
(
'apps/internal/back-top/app.json',
'989931f5-7e35-4943-b11d-00a0b900626c',
'application/json',
'2023-03-03 09:56:07',
'2023-03-03 09:56:07',
'{\n \"title\": \"回到顶部\",\n \"description\": \"为页面增加返回到页面顶部的按钮,提高用户体验。\"\n}\n',
null,
'2a0fe2215b02b5738926ff93cde566d43ad8188e',
'unknown'
)



近期评论