bigIncrements('id'); $table->timestamps(); $table->string('name')->unique(); }); Schema::create('models', function (Blueprint $table) { $table->bigIncrements('id'); $table->timestamps(); $table->string('name')->nullable(); $table->bigInteger('make_id')->unsigned()->nullable(); $table->foreign('make_id')->references('id')->on('makes'); $table->unique(['name','make_id']); }); Schema::create('software', function (Blueprint $table) { $table->bigIncrements('id'); $table->timestamps(); $table->string('name')->nullable(); $table->bigInteger('model_id')->unsigned()->nullable(); $table->foreign('model_id')->references('id')->on('models'); $table->unique(['name','model_id']); }); Schema::table('photo', function (Blueprint $table) { $table->bigInteger('software_id')->unsigned()->nullable(); $table->foreign('software_id')->references('id')->on('software'); }); $po = Photo::select(['make','model','software']) ->groupBy(['make','model','software']); foreach ($po->get() as $o) { if (! $o->make AND ! $o->model AND ! $o->software) continue; $ma = NULL; dump(['make'=>$o->make,'model'=>$o->model,'software'=>$o->software]); if ($o->make) $ma = Make::firstOrCreate(['name'=>$o->make]); $mo = Model::firstOrNew(['name'=>$o->model]); if ($ma) $mo->make_id = $ma->id; $mo->save(); $so = Software::firstOrNew(['name'=>$o->software]); if ($so) $so->model_id = $mo->id; $so->save(); foreach (Photo::where('make',$o->make) ->where('model',$o->model) ->where('software',$o->software) ->get() as $p) { $p->software_id = $so->id; $p->make = $p->model = $p->software = NULL; $p->save(); } } Schema::table('photo', function (Blueprint $table) { $table->dropColumn('make'); $table->dropColumn('model'); $table->dropColumn('software'); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::table('photo', function (Blueprint $table) { $table->string('make',32)->nullable(); $table->string('model',128)->nullable(); $table->string('software')->nullable(); }); foreach (Photo::whereNotNULL('software_id')->get() as $p) { $s = $p->software()->first(); $p->software = $s->name; if ($s->model) $p->model = $s->model->name; if ($s->model->make) $p->make = $s->model->make->name; $p->software_id = NULL; $p->save(); } Schema::table('photo', function (Blueprint $table) { $table->dropForeign(['software_id']); $table->dropColumn('software_id'); }); Schema::dropIfExists('software'); Schema::dropIfExists('models'); Schema::dropIfExists('makes'); } }