阅读(600) (10)

Laravel 8 updateOrCreate

2021-07-07 10:18:53 更新

你还可能遇到希望更新现有模型或在不存在的情况下则创建新的模型的情景。 Laravel 提供 updateOrCreate 方法来一步实现。 类似于 firstOrCreate 方法,updateOrCreate 持久化模型,因此无需调用 save()

// 如果有从奥克兰到圣地亚哥的航班,则价格定为 99 美元...
// 如果没匹配到存在的模型,则创建一个...
$flight = App\Models\Flight::updateOrCreate(
    ['departure' => 'Oakland', 'destination' => 'San Diego'],
    ['price' => 99, 'discounted' => 1]
);

如果你想在单次查询中执行多个 upsert,那么应该使用 upsert 方法。该方法的第一个参数是由要插入或更新的值组成,而第二个参数列出相应表中惟一标识记录的列,该方法的第三个也是最后一个参数是一个列数组,即如果数据库中已经存在匹配的记录,应该被更新的列。如果模型上启用了时间戳,upsert 方法将自动设置 created_atupdated_at 时间戳:

App\Models\Flight::upsert([
    ['departure' => 'Oakland', 'destination' => 'San Diego', 'price' => 99],
    ['departure' => 'Chicago', 'destination' => 'New York', 'price' => 150]
], ['departure', 'destination'], ['price']);

注意:除 SQL Server 之外的所有数据库都要求 upsert 方法的第二个参数中的列具有 “primary” 或 “unique” 索引。