2016-05-21 7 views
3

Ich benutze Laravel replicate() Methode eines Modells, um eine Kopie der bestehenden Instanz zu generieren. Es funktioniert gut, wenn es keine Spalten gibt, die uniqueLaravel 5 replicate() behandeln Spalten mit eindeutigem Attribut

In meinem Fall gibt es einige Spalten sein sollen, die eindeutig sein sind so verwende ich diese

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

Dies wird sicherstellen, dass, wenn ein Produkt repliziert sobald es das einzigartige Spaltenproblem behandelt. Wenn das Produkt jedoch erneut repliziert wird, wird das Problem erneut verursacht.

Wie ich kann ich dieses Problem lösen

Antwort

3

ich in der Datenbank product_code ans Set würde name als nullables und dann so etwas tun:

$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(); 

Natürlich können Sie diese in eine Funktion in Fall wickeln könnte Du machst es an mehreren Stellen.

0

folgende @Marcin Nabiałek'sanswer Ich löste das Problem mit kleinen Verbesserungen

$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(); 

Dies wird die old _id aus dem Namen und den Produktcode für einen Eintrag entfernen, die bereits _id am Ende hat und dann die new _id hinzufügen.

1

Kürzlich lief in dieses Problem, am effizientesten und effektivsten war nur Unix-Zeitstempel verwenden. Hier ist ein weiteres Beispiel, um Ihnen eine bessere Vorstellung von dem zu geben, was vor sich geht, ohne Felder und dergleichen auf Null setzen zu müssen.

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