photo/database/migrations/2019_11_23_125316_create_makemodel_tables.php
2019-11-27 21:30:43 +11:00

128 lines
3.3 KiB
PHP

<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use App\Models\{Photo,Make,Model,Software};
class CreateMakemodelTables extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('makes', function (Blueprint $table) {
$table->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');
}
}