我正在使用模型的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();
这将确保一旦产品处理了唯一列问题就会被复制。但如果再次复制产品,则会再次导致问题。
我如何解决这个问题
答案 0 :(得分:3)
我会将数据库product_code
和name
设置为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
。