为何Laravel的updateOrCreate需重复email?仅设查找条件时邮件丢失
Laravel updateOrCreate 重复字段的疑问解答
问题描述
我编写了一个用于创建管理员用户的Laravel数据填充器,代码如下:
User::updateOrCreate( ['email' => 'admin@shoestore.com'], [ 'name' => 'Administrator', 'email' => 'admin@shoestore.com', 'password' => Hash::make('password123'), 'email_verified_at' => now(), ] );
如果从第二个属性数组中移除第二个'email',填充器仍能运行,但更新后的记录中会缺失邮箱信息。我原本以为第二个数组只需包含额外属性,无需重复查找列,为什么updateOrCreate需要在第一个查找条件数组和第二个属性数组中重复填写email?
解答
这得从updateOrCreate的核心运行逻辑说起:
- 第一步:用第一个数组的查找条件去数据库匹配记录。找到匹配记录时,只会用第二个数组里的字段去覆盖更新原记录;没找到时,才会把两个数组的内容合并,创建新的记录。
- 它不会自动把查找条件里的字段同步到更新属性中。所以如果不在第二个数组里写
email:- 要是数据库里已有这条记录(email和查找条件一致),更新时只会修改
name、password这些字段,email保持原样,看起来没问题; - 但如果原记录的
email被意外修改过(比如改成了admin@oldstore.com),你用['email' => 'admin@shoestore.com']查找时会找不到,就会创建一条新的管理员记录; - 更关键的是,如果后续你调整了查找条件里的
email(比如改成admin@newstore.com),但第二个数组没同步更新email,那么找到原记录后只会更新其他字段,email还是原来的旧值,这就和你想要的“更新后邮箱和新查找条件一致”的预期不符。
- 要是数据库里已有这条记录(email和查找条件一致),更新时只会修改
- 重复填写
email,本质是为了确保无论查找条件怎么变,更新后的记录里这个字段都和当前的查找条件保持一致,避免出现数据不一致的情况。
内容的提问来源于stack exchange,提问作者Sphia
相关产品推荐
相关产品推荐

