我在拉威尔有一个模型叫Player
。此播放器数据是从外部API提取的。我正在尝试按计划从外部API更新此外部数据。外部API数据是players
表中应有内容的权威来源。
我目前拥有两个集合,一个是来自数据库的数据,另一个是外部API数据。我在一个基于API数据的集合中构建了新的Player
模型。
我现在的基本情况是:
Collection $playersInDatabase; // Eloquent Collection of type Player
Collection $playersFromApi; // Collection of type Player
$playersFromApi
数据只是转换为新播放器模型并添加到集合中的JSON API数据。
我的问题是,我不能只擦除整个players
表,因为我一次只修改表的一个子集。有没有一种有效的方法可以使用Laravel来比较这两者?我想向数据库中添加任何不存在的新播放器模型,更新任何具有不同数据的现有播放器模型,然后删除API数据不再具有但仍在数据库中的任何记录(过时记录)。
我能想到的唯一方法是多次迭代集合来完成我想做的事情,我觉得有一种更简单更优雅的方法可以更好地利用框架。
以下是players
表的外观,仅供参考。我目前正在使用播种机数据:
你可以这样做。无需进行比较,只需updateOrCreate()
,并在单个DB调用中删除未更新的对应角色的所有ID。
// the faction id you are querying from API
$faction_id = ...;
// for storing updated model ids
$updated_ids = [];
foreach ($playersFromApi as $playerFromApi) {
// update record or create a new one
$player = Player::updateOrCreate(
[
// conditions to meet
'...' => $playerFromApi['...']
],
[
// data to update
'...' => $playerFromApi['...']
]
);
// store id of updated model
$updated_ids[] = $player->id;
}
// delete models not updated
Player::where('faction_id',$faction_id)->whereNotIn('id',$updated_ids)->delete();