使用->replicate()
$oldrow = MyModel::find($id);
$newrow = $oldrow->replicate();
$newrow->some_column = 'new data';
$newrow->save();
基本使用到命令如上。
然而它是否如我们想像般工作的?
表ID没有更新不会有问题?
你可能会考虑到在复制的时候,是否会把原数据的ID也复制过来。如果新旧两条数据都持有同样的ID,在数据保存的时候会不会发生问题?
事实是对model来说,同1个ID对应的是一条数据,当指定ID时操作的是同一条数据。即是覆盖而不是复制。
可能不经意间,你会写出以下代码,习惯性地把ID置空。
$oldrow = MyModel::find(2145);
$newrow = $oldrow->replicate();
$newrow->id = null;
$newrow->some_column = 'new data';
$newrow->save();
然而,这就不是replicate 命令的真实含义了。
让我们手动敲命令来了解他是如何具体工作的。
$oldrow = MyModel::find(2145);
$newrow = $oldrow->replicate();
var_dump( $oldrow->id ); // 2145
var_dump( $newrow->id ); // NULL *在执行replicate命令时,表主键ID默认为空*
$newrow->some_column = 'new data';
$newrow->save();
ID复制时为空,那created_at, updated_at 这两个字段更新吗?
复制时,手动为数据打上时间戳。
$oldrow = MyModel::find(2145);
$newrow = $oldrow->replicate();
$newrow->created_at = date('Y-M-D H:m:s');
$newrow->some_column = 'new data';
$newrow->save();
是不是觉得很烦?这哪像是在复制?
$oldrow = MyModel::find(2145);
$newrow = $oldrow->replicate();
var_dump( $oldrow->created_at ); // 2016-09-26 23:15:33
var_dump( $oldrow->updated_at); // 2016-09-26 23:15:33
var_dump( $newrow->created_at ); // NULL
var_dump( $newrow->updated_at); // NULL
$newrow->some_column = 'new data';
$newrow->save();
var_dump( $newrow->created_at ); // 2016-09-26 23:22:51 调用save()打的时间戳
var_dump( $newrow->updated_at); // 2016-09-26 23:22:51
不调用save()可以吗?
$oldrow = MyModel::find(2145);
$newrow = $oldrow->replicate();
$newrow->some_column = 'new data';
exit;
$newrow->save();
答案是:?
有兴趣的同学可以手动实验下。