提问者:小点点

如何基于Laravel中的另一个集合比较和更新雄辩的集合


我在拉威尔有一个模型叫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表的外观,仅供参考。我目前正在使用播种机数据:


共1个答案

匿名用户

你可以这样做。无需进行比较,只需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();