2016-06-02 2 views
1

Я использую таблицы пользователя, планирую и планирую детали. Где:Создание новых строк из результатов с помощью ORM

Пользователь:

public function plan_details() 
{ 
    return $this->hasMany('App\Plan_Detail'); 
} 
public function plans() 
{ 
    return $this->hasMany('App\Plan'); 

План:

public function details() 
    { 
     return $this->hasMany('App\Plan_Detail'); 
    } 

Я пытаюсь создать новый план из существующего плана следующим образом:

public function store(Request $request) 
{ 
    $this->validate($request, [ 'title' => 'required', 
           'description' => 'required']); 
    $input = $request->all(); 

    $plan_details = Plan_Detail::ofUser()->get(); 
    $plan = new Plan($request->all()); 

    DB::beginTransaction(); 
    Auth::user()->plans()->save($plan); 

    try { 
     foreach ($plan_details as $k => $plan_detail) 
     Plan::find($plan['id'])->details()->save($plan_detail); 
     DB::commit(); 
    } catch (Exception $e) { 
     Log::error("PGSQL plan detail " . $e->message()); 
     DB::rollback(); 
     session()->flash('message', 'Error al guardar el plan de entreno'); 
    } 

    return redirect('plans'); 
} 

Эта линия делает отредактируйте детали плана, чтобы больше не относиться к старому плану и войти в новый:

Plan :: find ($ plan ['id']) -> details() -> save ($ plan_detail);

Я переработан код для ОРМА несколько коммитов назад и теперь я обнаружил эту ошибку, я делал все поля в массиве, как перед сохранением:

  foreach ($plan_details as $k => $plan_detail) { 
+   $detail_line['exercise_id'] = $plan_detail['exercise_id']; 
      $detail_line['plan_id'] = $plan['id']; 

Я не хотел бы вернуться к это, но не может думать о том, как связать Auth :: user с планом и с данными плана таким образом и создавать новые элементы.

Если я использую User-> plan_details(), мне нужно будет указать, какой plan_id.

Если я использую Запланировано> детали я должен указать user_id

Не могу это сделать?

ответ

0

Так что я нашел магический метод -> REPLICATE(), и это работает

Plan::find($plan['id'])->details()->save($plan_detail->replicate()); 

Кроме того, эта замена на Еогеасп должна быть оптимизация вставных запросов:

$replicants = []; 
    foreach ($plan_details as $k => $plan_detail) 
    $replicants[] = $plan_detail->replicate(); 

    Plan::find($plan['id'])->details()->saveMany($replicants);