使用ORM

时间:2016-06-02 12:51:30

标签: php laravel 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');
}

此行确实编辑了计划详细信息,因此不再属于旧计划并进入新计划:

  

计划::找到($计划[ 'ID']) - >细节() - >保存($ plan_detail);

我重构了代码以便在某些提交之前发现,现在我发现了这个bug,我在保存之前就像在数组中的所有字段一样:

         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。

如果我使用Plan->详细信息,我必须指定user_id

不能这样做吗?

1 个答案:

答案 0 :(得分:0)

所以我找到了神奇的方法 - > replicate()并且它正在工作

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

此外,foreach的替换应该是插入查询中的优化:

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

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