微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

尝试从foreach中求和,但只返回一个值

如何解决尝试从foreach中求和,但只返回一个值

$ surrender的每个实例都有多个功能,每个功能都有不同的稀有度 我想根据合并后的总数来计算

以下是我的代码

$features = $surrender->character->image->features()->get();
foreach($features as $traits) {
$rarity = Rarity::where('id',$traits->rarity_id)->first();

switch($rarity->name) {
// e.g if the rarity name returns rare,the cost is 100
case 'rare':
$cost = 100;
break;
}};

$totalcost = collect($cost)->sum();
}
else $totalcost = NULL;

但是,例如当我具有稀有性“ rare”的两个功能时,它仅返回100。

example

如何修改代码以使其正常运行?

解决方法

您在每个循环中都辅助使用相同的值:

name: Build production container

on:
  release:
    types:
      - created

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Build the Docker image
        run: |
          echo "${{ SECRET }}" | docker login -u ME --password-stdin docker.pkg.github.com
          docker build app/ -t docker.pkg.github.com/REPO_PATH/image:$VERSION
          docker push docker.pkg.github.com/REPO_PATH/image:$VERSION
        shell: bash
        env:
          VERSION: 0.0.1

要获取摘要,您可以简单地累积费用:

$cost = 100;

将其应用于您的代码段:

$cost += 100;
,

问题已经有选定的答案。

如果有人对重构代码感兴趣,请使用laravel collection方法。

$totalCost = $surrender->character->image->features->sum(function($feature) {
    return Rarity::where('id',$traits->rarity_id)->where('name','rare')->exists() ? 100 : 0;
});

提高效率

前一种方法的问题在于,要获取每个rare的{​​{1}},将有多个数据库调用。为避免这种情况,我们可以急于加载feature

rare模型中定义rarity()关系

Feature

现在在控制器中

public function rarity()
{
    return $this->bgelongsTo(Rarity::class);
}

另一种方法

我假设您只想总结“稀有特征”的稀有性。然后,仅获取罕见的功能。

$features = $surrender->character->image->features()->with('rarity')->get();

$totalCost = $features->sum(function($feature) {
    return $feature->rarity->name == 'rare' ? 100 : 0;
});

另一种方法

似乎我们甚至不想获取“稀有特征”。我们只需要计数“稀有特征”即可。

$rarefeatures = $surrender->character->image->features()
    ->whereHas('rarity',function($query) {
        return $query->name('name','rare');       
    })->get();

$totalCost = $rareFeatures->sum(function($feature) {
    return 100;
});

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。