代码之家  ›  专栏  ›  技术社区  ›  Zoli

Laravel Eloquent ORM复制

  •  20
  • Zoli  · 技术社区  · 10 年前

    我在用所有关系复制我的一个模型时遇到了问题。

    数据库结构如下:

    Table1: products
    id
    name
    
    Table2: product_options
    id
    product_id
    option
    
    Table3: categories
    id
    name
    
    Pivot table: product_categories
    product_id
    category_id
    

    关系包括:

    • 产品有许多产品选项
    • 产品属于ToMany类别(通过product_categories)

    我想克隆一个具有所有关系的产品。目前这是我的代码:

    $product = Product::with('options')->find($id);
    $new_product = $product->replicate();
    $new_product->push();
    foreach($product->options as $option){
        $new_option = $option->replicate();
        $new_option->product_id = $new_product->id;
        $new_option->push();
    }
    

    但这不起作用(关系没有克隆-目前我只是尝试克隆product_options)。

    4 回复  |  直到 10 年前
        1
  •  23
  •   Community Mohan Dere    9 年前

    这段代码对我很有用:

    $model = User::find($id);
    
    $model->load('invoices');
    
    $newModel = $model->replicate();
    $newModel->push();
    
    foreach($model->getRelations() as $relation => $items){
        foreach($items as $item){
            unset($item->id);
            $newModel->{$relation}()->create($item->toArray());
        }
    }
    

    从这里回答: Clone an Eloquent object including all relationships?

    这个答案(同样的问题)也很好。

    //copy attributes from original model
    $newRecord = $original->replicate();
    // Reset any fields needed to connect to another parent, etc
    $newRecord->some_id = $otherParent->id;
    //save model before you recreate relations (so it has an id)
    $newRecord->push();
    //reset relations on EXISTING MODEL (this way you can control which ones will be loaded
    $original->relations = [];
    //load relations on EXISTING MODEL
    $original->load('somerelationship', 'anotherrelationship');
    //re-sync the child relationships
    $relations = $original->getRelations();
    foreach ($relations as $relation) {
        foreach ($relation as $relationRecord) {
            $newRelationship = $relationRecord->replicate();
            $newRelationship->some_parent_id = $newRecord->id;
            $newRelationship->push();
        }
    }
    

    从这里开始: Clone an Eloquent object including all relationships?

    在我的经验中,该代码适用于多对多关系。

        2
  •  3
  •   alexw    10 年前

    尝试使用 attach 要创建关系:

    foreach($product->options as $option){
        $new_option = $option->replicate();
        $new_option->save();
        $new_option_id = $new_option->id;
        $new_product->options()->attach($new_option_id);
    }
    
        3
  •  3
  •   Luis Vasquez    10 年前
    $product = Product::with('options')->find($id);
    $new_product = $product->replicate();
    $new_product->{attribute} = {value};
    $new_product->push();
    
    $new_product->options()->saveMany($product->options);
    
        4
  •  1
  •   avinash    8 年前

    这在5.5上运行良好。 图像、媒体是一个关系名称。

    $event = Events::with('image','media')->find($event_id);
                if($event){
                    $newevent = $event->replicate();
                    $newevent->push();
                     foreach ($newevent->getRelations() as $relation => $entries)
                     {
                        foreach($entries as $entry)
                        {
                            $e = $entry->replicate();
                            if ($e->push())
                            {
                                $newevent->{$relation}()->save($e);
                            }
                        }
    
                    }                                
    
                }