1、在 Laravel 6 中,执行 updateOrCreate 方法,以更新现有模型或在不存在的情况下则创建新的模型。最后生成的 SQL 如下,缺少字段 checksum。如图1

图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

图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

图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'
  )
永夜