我正在使用表格用户,计划和计划详细信息。其中:
用户:
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
不能这样做吗?
答案 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);