我试图在Laravel 8中复制一条记录及其关系,但我想保留原始记录的时间戳。我可以在主记录上执行此操作,但是所有关系上的时间戳都设置为复制记录的日期时间。我还设置了一些观察器,我不希望它们在复制发生时触发。
$order = App\Models\Order::with('comments', 'tracking_details')->find(4096);
$clone = $order->replicate()->fill([
'tracking_number' => null,
'created_at' => $order->created_at,
'updated_at' => $order->updated_at,
]);
$clone->saveQuietly();
foreach ($order->comments as $comment) {
App\Models\Comments::withoutEvents(function() use ($clone, $comment) {
$clone->comments()->create($comment->toArray());
});
}
foreach ($order->tracking_details as $details) {
App\Models\TrackingDetails::withoutEvents(function() use ($clone, $details) {
$clone->tracking_details()->create($details->toArray());
});
}任何帮助都将不胜感激。
发布于 2021-10-19 23:36:52
对于关系,您可以改用查询生成器。
// main record
$order = Order::find(4096);
$clone = $order->replicate()->fill([
'tracking_number' => null,
'created_at' => $order->created_at,
'updated_at' => $order->updated_at
]);
$clone->saveQuietly();
// comments relationship
$comments = Comments::toBase()->where('order_id', $order->id)->orderBy('id')->get()->map(function ($item) use ($clone) {
unset($item->id);
$item->order_id = $clone->id;
return (array) $item;
});
Comments::insert($comments->toArray());
// tracking_details relationship
$trackingDetails = TrackingDetails::toBase()->where('order_id', $order->id)->orderBy('id')->get()->map(function ($item) use ($clone) {
unset($item->id);
$item->order_id = $clone->id;
return (array) $item;
});
TrackingDetails::insert($trackingDetails->toArray());在这种情况下,您不使用eloquent,这意味着不会触发任何事件,您将保留原始记录的时间戳。
发布于 2021-10-14 03:28:22
不确定这是否会起作用,但你有没有尝试在你的模型中禁用时间戳?
public $timestamps = FALSE;发布于 2021-10-18 11:45:07
如果您希望您的模型能够通过create()方法保存您的时间戳,那么您应该将created_at和updated_at属性添加到您的模型的$fillable中。参考:Making properties mass assignable
https://stackoverflow.com/questions/69564688
复制相似问题