如何使用Laravel Eloquent复制数据库表中的单条数据

使用->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();

答案是:?
有兴趣的同学可以手动实验下。

发表评论

电子邮件地址不会被公开。 必填项已用*标注