Laravel集合映射功能会覆盖默认集合

时间:2018-08-17 12:53:50

标签: php laravel collections

我有一个代码,可以在其中使用地图来创建新的高分集合。 我的问题是它会覆盖默认的用户集合。这不是我的意图。

这是代码

    $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'),
            ];
        }
    );

如果在获得所有用户后转储第一个用户,我将获得第一个用户。这样。

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

如果我放弃高分地图之后的第一个用户。我从该用户那里获得了所有呼叫,这是另一个模型。这意味着用户集合已被修改。这样。

$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()):

关于如何处理此行为的任何想法?

1 个答案:

答案 0 :(得分:0)

map函数返回[[$ userId => $ duration],...]的数组。您要做的是根据用户的通话总数对他们进行排序。

我相信,为了轻松做到这一点,您应该将其添加到用户模型中:

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');
}

然后编辑查询:

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

我尚未测试此代码,但我认为它应该可以帮助您朝正确的方向前进。