【问题标题】:Modify single Item of Laravel Collection without mapping every single item修改 Laravel 集合的单个项目而不映射每个项目
【发布时间】:2022-11-10 23:35:30
【问题描述】:

我通过一个雄辩的集合循环,我想将数据添加到另一个名为“$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() 将项目从集合中删除,然后使用新评级再次推送它,但我也不知道如何

【问题讨论】:

  • 我不明白,你想给特定的入门评分加 0.5 吗?或者也将其余部分的评级值强制为 0.35。
  • @N69S 是的,对不起。在我的示例中,0.35 是基值。在下一次运行中,我检查是否存在具有相同 tag_id 的条目。如果是,则修改此条目并将 0.5(这也是一个示例值)添加到此条目的现有评级

标签: laravel eloquent laravel-collection


【解决方案1】:

如果最终目标是更新 $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 的每次出现更新评级,然后将其保存在数据库中
  • 你的逻辑不合逻辑。如果最终目标是为每个具有特定标签 ID 的条目添加 0.5 评分,则直接使用查询进行。
猜你喜欢
  • 2013-07-13
  • 2021-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-26
  • 1970-01-01
相关资源
最近更新 更多