【发布时间】:2020-02-23 18:11:49
【问题描述】:
我有一个将结构化数据保存到部分的表单,当我想编辑这些字段时遇到了一个棘手的情况。该表单具有动态字段,因此您可以在每个部分中添加任意数量的部分和字段。 我有一个主表,其中存储“例程”,它可以有多个“部分”,并且可以有多个“练习”条目。 现在我的解决方案是删除当前条目并将所有内容保存为全新的例程。
public function update(Request $request, $id)
{
$user = auth()->user();
$user->routines()->whereId($id)->delete();
$requestArr = $request->all();
$routine = new Routine();
$routine->user_id = auth()->user()->id;
$routine->name = $requestArr['name'];
$routine->description = $requestArr['description'];
$routine->save();
$routine_id = $routine->id;
foreach($requestArr['sections'] as $item){
$section = new Section();
$section->name = $item['name'];
$section->description = $item['description'];
$section->routine_id = $routine_id;
$section->save();
$section_id = $section->id;
if( array_key_exists( 'exercises', $item ) ){
foreach($item['exercises'] as $item2){
$exercise = new Exercise();
$exercise->name = $item2['name'];
$exercise->description = $item['description'];
$exercise->duration = 60;
$exercise->duration_unit = 'seconds';
$section->exercises()->save($exercise);
}
}
}
return redirect('/routines');
}
我确信有一种更“优雅”的方式来做到这一点。
我的迁移: 例程:
Schema::create('routines', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('user_id');
$table->string('name');
$table->string('description');
$table->timestamps();
$table->foreign('user_id')
->references('id')
->on('users')
->onDelete('cascade');
});
部分:
Schema::create('sections', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('routine_id');
$table->string('name');
$table->string('description');
$table->timestamps();
$table->foreign('routine_id')
->references('id')
->on('routines')
->onDelete('cascade');
});
练习:
Schema::create('exercises', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->string('description');
$table->integer('duration');
$table->string('duration_unit');
$table->timestamps();
});
例程 - 一对多 - 部分 部分 - 多对多 - 练习(我有一个 exercise_section 中间表)
所以我的问题是,如何在不删除当前条目的情况下更新条目?因为万一添加了一些新的部分/练习,只有那些插入应该发生,所以只需 ->update();
【问题讨论】:
标签: laravel