【问题标题】:Laravel 5 replicate() handle columns that have unique attributeLaravel 5 replicate() 处理具有唯一属性的列
【发布时间】:2016-05-21 15:38:43
【问题描述】:
我正在使用模型的 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();
这将确保如果产品被复制一次,它将处理唯一列问题。但是如果产品再次被复制,它会再次导致问题。
我该如何解决这个问题
【问题讨论】:
标签:
mysql
laravel
laravel-5
eloquent
unique
【解决方案1】:
我会在数据库中将 product_code 和 name 设置为可空值,然后执行以下操作:
$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();
当然,您可以将其包装成一个函数,以防您在多个地方执行此操作。
【解决方案2】:
最近遇到这个问题,最有效的就是使用unix时间戳。这是另一个示例,可让您更好地了解正在发生的事情,而无需将字段设为空等。
$page = Page::find($id);
$duplicatePage = $page->replicate();
$duplicatePage->name = 'Copy of ' . $page->name;
$duplicatePage->slug = $page->slug . '-' . time();
$duplicatePage->save();
【解决方案3】:
在@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。