我有一个代码,可以在其中使用地图来创建新的高分集合。 我的问题是它会覆盖默认的用户集合。这不是我的意图。
这是代码
$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()):
关于如何处理此行为的任何想法?
答案 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();
我尚未测试此代码,但我认为它应该可以帮助您朝正确的方向前进。