【发布时间】:2021-01-08 15:13:35
【问题描述】:
我试图将原始数据保存在一个名为 $copyItems 的临时变量中,但每当我更改原始变量 $items 的值时,复制的变量也会发生变化。
举个例子:
$items = \App\Models\Customers::with('Account')->get();
$copyItems = $items; // Should hold all the original $items values no matter the changes
// Prints "Stackoverflow"
echo $copyItems[0]->Account->name;
$items[0]->Account->name = 'John';
// Prints "John" and should print "Stackoverflow"
echo $copyItems[0]->Account->name;
这到底是怎么回事?我没有使用变量引用&$items 为什么我的临时变量被更改了?
使用clone $items 方法,结果是一样的。
【问题讨论】:
-
@SandroVardiashvili
->replicate()在数据库中创建一个新行,我不想要它。 -
当您将一个对象分配给另一个变量时,您并没有“复制”它......两个变量都指向同一个对象......并且调用
clone只会克隆集合,而不是克隆每个对象,所以即使是新的 Collection 也将包含与另一个完全相同的对象 -
在这种情况下,您可以将 Laravel 集合用于
$copyItems,然后执行$copyItems = collect($items); -
@SandroVardiashvili
collect($items)在我的情况下工作得很好,这样我就不需要做另一个数据库查询。将其设置为答案,我会接受。