Я перебираю красноречивую коллекцию и хочу добавить данные в другую коллекцию под названием «$ tagCollection». Если запись с таким же tag_id уже существует, я хочу только увеличить столбец рейтинга для существующей записи. На данный момент это выглядит так. У кого-нибудь есть идея?
$tagCollection = collect();
$entries->each(function($entry) use($tagCollection){
$tagId = $entry->tag_id;
//something like this
if ($tagCollection->contains('tag_id', $tagId)){
$tagCollection->update ('rating' => $oldRating + 0.5)
} else{
$tagCollection->push(array(
'tag_id' => $tagId,
'rating' => 0.35
));
}
});
Я также пытался использовать ->pull(), чтобы удалить элемент из коллекции, а затем снова нажать его с новым рейтингом, но я также не знаю, как это сделать.
@ N69S да, извините. 0,35 для моего примера является базовым значением. При следующем прогоне я проверяю, существует ли запись с таким же tag_id. Если да, измените эту запись и добавьте 0,5 (что также является примерным значением) к существующему рейтингу для этой записи.
Если конечной целью является обновление всех записей, присутствующих в $entries
, которые принадлежат определенному $tagId
, вы можете сделать это
$entryIds = $entries->where('tag_id',$tagId)->pluck('id')->toArray();
Entry::whereIn('id', $entryIds)->update(['rating' => \DB::raw('rating + 0.5')]);
Вот и все.
Я это тоже уже пробовал. Если я сделаю это, как вы, я получаю сообщение об ошибке с попыткой прочитать рейтинг свойства в массиве. Если я это сделаю $specificEntry['rating'] = $specificEntry['rating'] + 10;
ничего не изменится
Обновленный рейтинг не будет добавлен в $tagCollection. Я тоже думал, что это будет так просто :(
@ProgrammingDude, вы не понимаете, что вам нужно сделать. вы хотите обновить записи в $entries
или они уже в $tagCollection
?
Из $entries я получаю свои данные, которые я хочу поместить в дополнительную коллекцию под названием $tagCollection. Когда все данные будут переданы, я хочу сохранить их в своих моделях баз данных. Я мог бы сохранить его напрямую и каждый раз обновлять модель с одним и тем же tag_id, но это были бы ненужные вызовы базы данных, не так ли? Вот почему я хочу сначала собрать все tag_id в коллекции ($tagCollection), чтобы они были уникальными, обновить рейтинг при каждом появлении tag_id, а затем сохранить его в базе данных.
Ваша логика нелогична. если конечная цель состоит в том, чтобы добавить 0,5 рейтинга к каждой записи с определенным идентификатором тега, то сделайте это напрямую с запросом.
Даже если есть 20 записей с (например) tag_id 30 в $entries, а затем данные должны обновляться в базе данных 20 раз? Вот почему я хотел сначала изменить его в $tagCollection, а затем сохранить правильный рейтинг в базе данных.
и как вы собираетесь сохранять данные в $tagCollection
?
@ProgrammingDude обновил ответ, чтобы сделать то, что вам нужно, в одном запросе.
Можете ли вы сделать это с массивом вместо коллекции? Например:
$tagArray = [];
$entries->each(function ($entry) use (&$tagArray) {
if (isset($tagArray[$entry['tag_id']])) {
$tagArray[$entry['tag_id']] += 0.5;
} else {
$tagArray[$entry['tag_id']] = 0.35;
}
});
Ух ты. Так намного проще. Не знаю, почему я так зациклился на коллекциях. Большое спасибо!
Я не понимаю, вы хотите добавить 0,5 к рейтингу конкретной записи? или также установить значение рейтинга остальных до 0,35.