Как сравнить и обновить красноречивую коллекцию на основе другой коллекции в Laravel - PullRequest
0 голосов
/ 19 июня 2020

У меня есть модель в Laravel под названием Player. Эти данные игрока извлекаются из внешнего API. Я пытаюсь обновлять эти внешние данные по расписанию из внешнего API. Внешние данные API являются авторитетным источником того, что должно быть в таблице players.

В настоящее время у меня есть две коллекции, одна - это данные из базы данных, другая - данные внешнего API. Я построил новые модели Player в коллекции на основе данных API.

По сути, сейчас у меня есть следующее:

Collection $playersInDatabase; // Eloquent Collection of type Player
Collection $playersFromApi; // Collection of type Player

Данные $playersFromApi - это просто JSON Данные API преобразованы в новые модели Player и добавлены в коллекцию.

Моя проблема в том, что я не могу просто стереть всю таблицу players, поскольку я изменяю только подмножество таблицы за раз. Есть ли эффективный способ использовать Laravel для сравнения этих двух? Я хочу добавить любые новые модели Player в базу данных, которые не существуют, обновить любую существующую модель Player, которая имеет разные данные, а затем также удалить все записи, которых в данных API больше нет, но которые все еще находятся в базе данных (устаревшие записи) .

Единственный способ, который я могу придумать для этого, заключается в многократном повторении коллекций для выполнения sh того, что я хочу сделать, и я чувствую, что есть более простой и элегантный способ сделать это, лучше используя каркас.

Вот как выглядит таблица players для справки. В настоящее время я использую данные сеялки:

example table

1 Ответ

1 голос
/ 20 июня 2020

Вы могли бы сделать что-то вроде этого. Никаких сравнений не требуется, просто updateOrCreate() и удалите все идентификаторы, не обновленные для соответствующей фракции, за один вызов БД.

// 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();
...