gpt4 book ai didi

php - 制作 Laravel 集合的副本

转载 作者:行者123 更新时间:2023-12-02 16:40:07 26 4
gpt4 key购买 nike

我正在尝试将用户集合的副本提供给 Eloquent 模型作业。所以我实际上可以:

jobs : [
1 : {
users : {
1: {}
2: {}
3: {}
}
}
2 : {
users : {
1: {}
2: {}
3: {}
}
}
]

一旦我得到这个,我将对另一个查询中的一些数字进行求和,本质上为每个作业的每个用户提供一个总数,因此上面的结果可能看起来像这样:

jobs : [
1 : {
users : {
1: {
total: 120
}
2: {
total: 45
}
3: {
total: 12
}
}
}
2 : {
users : {
1: {
total: 32
}
2: {
total: 4
}
3: {
total: 17
}
}
}
]

除了我似乎无法克隆此用户列表,而且我实际上最终得到的所有总数彼此相同:

{  
1:{
id:1,
users:{
1:{
id:1,
total:807
},
2:{
id:2,
total:9
}
}
},
2:{
id:2,
users:{
1:{
id:1,
total:807
},
2:{
id:2,
total:9
}
}
},
3:{
id:3,
users:{
1:{
id:1,
total:807
},
2:{
id:2,
total:9
}
}
}
}

这就是我正在做的事情:

public function summary()
{
$jobs = Job::all()->keyBy('id');
$users = User::with('closed_time_chunks')->get();

$users_list = User::all(['id'])->keyBy('id');

// I think this is the problem statement:
foreach ($jobs as $job):
$job->users = clone $users_list;
endforeach;

Log::info('Starting');


foreach ($users as $user):
foreach ($user->closed_time_chunks as $chunk):

Log::info('Adding ' . ($chunk->stop_time - $chunk->start_time) . ' to job: ' . $chunk->job_id);
$jobs[$chunk->job_id]->users[$chunk->user_id]['total'] += $chunk->stop_time - $chunk->start_time;

endforeach;
endforeach;
}

我的猜测是,我实际上只是创建对同一事物的引用,任何添加实际上只是添加到“主”集合中。如何成功克隆用户以使总数在作业中保持唯一?

编辑

使用数组(正如 Matheos 推荐的那样)会导致一个非常奇怪的错误:

ErrorException (E_NOTICE)

Indirect modification of overloaded property Job::$users has no effect

最佳答案

您的问题是您正在克隆 $users_list,但那是 User 对象的 Collection。在 PHP 中,当您克隆一个对象时,它的任何引用对象的属性仍然是对这些对象的引用,换句话说,这些子对象本身不会被克隆。请参阅__clone

由于您的代码正在向 Collection 中的每个 User 实例动态添加“total”属性,因此它有效地改变了该特定实例的所有实例的总值(value)User,因为它们都是对自身的引用。您需要做的是克隆 Collection 的每个子成员 (User) 以及 Collection 本身。

foreach ($jobs as $job):
$job->users = clone $users_list;
$job->users->transform(function($user) { return clone $user; });
endforeach;

可能有更好的方法来完成您想要做的事情,但这应该可以帮助您继续前进,并希望也能回答您的“为什么”问题。

关于php - 制作 Laravel 集合的副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29741763/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com