首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel复制包含关系,但保留原始时间戳

Laravel复制包含关系,但保留原始时间戳
EN

Stack Overflow用户
提问于 2021-10-14 03:19:16
回答 4查看 347关注 0票数 1

我试图在Laravel 8中复制一条记录及其关系,但我想保留原始记录的时间戳。我可以在主记录上执行此操作,但是所有关系上的时间戳都设置为复制记录的日期时间。我还设置了一些观察器,我不希望它们在复制发生时触发。

代码语言:javascript
复制
$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());
    });
}

任何帮助都将不胜感激。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2021-10-19 23:36:52

对于关系,您可以改用查询生成器。

代码语言:javascript
复制
// 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,这意味着不会触发任何事件,您将保留原始记录的时间戳。

票数 1
EN

Stack Overflow用户

发布于 2021-10-14 03:28:22

不确定这是否会起作用,但你有没有尝试在你的模型中禁用时间戳?

代码语言:javascript
复制
public $timestamps = FALSE;
票数 0
EN

Stack Overflow用户

发布于 2021-10-18 11:45:07

如果您希望您的模型能够通过create()方法保存您的时间戳,那么您应该将created_atupdated_at属性添加到您的模型的$fillable中。参考:Making properties mass assignable

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69564688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档