doujubeng2942 2018-08-17 12:53
浏览 74

Laravel集合映射函数会覆盖默认集合

I have a code where I use map to create a new collection of high scores. The problem I have is that it overrides the default user collections. Which is not my intention.

Here is the code

    $users = Users::all();
    $highscore = $users->map(
        function ($user) {
            $calls = $user->calls->filter(
                function ($call) {
                    $date = Carbon::parse($call->datetime)->format("Y-m-d");
                    $today = Carbon::now()->format("Y-m-d");
                    return $date == $today;
                }
            );
            return [
                'id' => $user->id,
                'duration' => $calls->sum('duration'),
            ];
        }
    );

If i dump the first user after getting all the users I get the first user. Like this.

$users = Users::all();
dd($users->first());

If I dump the first user after the high score map. I get all Calls from that user which is another model. Which means that the users collection has been modified. Like this.

$highscore = $users->map(
    function ($user) {
        $calls = $user->calls->filter(
            function ($call) {
                $date = Carbon::parse($call->datetime)->format("Y-m-d");
                $today = Carbon::now()->format("Y-m-d");
                return $date == $today;
            }
        );
        return [
            'id' => $user->id,
            'duration' => $calls->sum('duration'),
        ];
    }
);
dd($users->first()):

Any idea on how to handle this behaviour?

  • 写回答

1条回答 默认 最新

  • download2565 2018-08-17 20:43
    关注

    The map function returns an array of [[$userId => $duration], ...]. What you want to do is to order your users by the sum of their calls.

    I believe that, in order to do that easily, you should add to your User model:

    public function getTodayCallSum() {
        return $user->calls->filter(function($call) {
            $date = Carbon::parse($call->datetime)->format("Y-m-d");
            $today = Carbon::now()->format("Y-m-d");
            return $date == $today;
        })->sum('duration');
    }
    

    And then edit your query:

    $users = User::all();
    $firstUser = $users->sortBy('todayCallSum')->first();
    

    I haven't tested this code, but I think it should help you towards the right direction.

    评论

报告相同问题?

悬赏问题

  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 unity第一人称射击小游戏,有demo,在原脚本的基础上进行修改以达到要求
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)