Чтобы решить эту проблему, я написал макросы, способные выполнять необходимые обновления.
// Set a single value by dot notation key.
Collection::macro('set', function ($key, $new) {
$key = explode('.', $key);
$primary_key = array_shift($key);
$key = implode('.', $key);
$current = $this->get($primary_key);
if (!empty($key) && is_array($current)) {
array_set($current, $key, $new);
} else {
$current = $new;
}
$this->put($primary_key, $current);
});
// Increment a single value by dot notation key.
Collection::macro('increment', function ($key, $amount) {
$key = explode('.', $key);
$primary_key = array_shift($key);
$key = implode('.', $key);
$current = $this->get($primary_key);
if (!empty($key) && is_array($current)) {
$new = array_get($current, $key, 0);
$new += $amount;
array_set($current, $key, $new);
} else {
$current += $amount;
}
$this->put($primary_key, $current);
});
// Decrement a single value by dot notation key.
Collection::macro('decrement', function ($key, $amount) {
$key = explode('.', $key);
$primary_key = array_shift($key);
$key = implode('.', $key);
$current = $this->get($primary_key);
if (!empty($key) && is_array($current)) {
$new = array_get($current, $key, 0);
$new -= $amount;
array_set($current, $key, $new);
} else {
$current -= $amount;
}
$this->put($primary_key, $current);
});
С этим все, что мне нужно сделать, это что-то вроде:
$ads->increment($insight[$key] . '.spend', $insight[AdsInsightsFields::SPEND]);
Если я хочупросто установите значение, независимо от того, существует ключ или нет, я могу сделать это:
$ads->set($insight[$key] . '.spend', $insight[AdsInsightsFields::SPEND]);