Laravel 5 replicate()处理具有唯一属性的列

时间:2016-05-21 15:38:44

标签: mysql laravel laravel-5 eloquent unique

我正在使用模型的laravel replicate()方法来生成现有实例的副本。如果没有要成为unique

的列,它可以正常工作

在我的情况下,有一些列是唯一的,所以我使用这个

    $pr = Products::find(\Input::get('id'))->replicate();
    $pr['product_code'] = $pr->product_code . '_'.$pr['id'];
    $pr['name'] = $pr->name . '_'.$pr['id'];
    $pr->save();

这将确保一旦产品处理了唯一列问题就会被复制。但如果再次复制产品,则会再次导致问题。

我如何解决这个问题

3 个答案:

答案 0 :(得分:3)

我会将数据库product_codename设置为nullables,然后执行以下操作:

$product = Products::find(\Input::get('id'));
$newProduct = $product->replicate(['product_code', 'name']);
$newProduct->save();
$newProduct->product_code = $product->product_code.'_'.$newProduct->id;
$newProduct->name = $product->name.'_'.$newProduct->id;
$newProduct->save();

当然,如果你在多个地方做这件事,你可以把它包装成一个函数。

答案 1 :(得分:1)

最近碰到这个问题,最有效率的只是使用unix时间戳。这是另一个例子,可让您更好地了解正在发生的事情,而无需使用空字段等。

    $page = Page::find($id);
    $duplicatePage = $page->replicate();
    $duplicatePage->name = 'Copy of ' . $page->name;
    $duplicatePage->slug = $page->slug . '-' . time();
    $duplicatePage->save();

答案 2 :(得分:0)

关注@Marcin Nabiałek's answer我用小改进解决了这个问题

$product = Products::find(\Input::get('id'));
$newProduct = $product->replicate();
$newProduct->save();
$newProduct->product_code = str_replace("_".$product->id,"",$product->product_code).'_'.$newProduct->id;
$newProduct->name = str_replace("_".$product->id,"",$product->name).'_'.$newProduct->id;
$newProduct->save();

这将从名称和产品代码中删除最后已有old _id的条目的_id,然后添加new _id