From c137e9ab1b0122b57c52a27ff11ae1c4106ee00d Mon Sep 17 00:00:00 2001 From: James Brooks Date: Mon, 2 Apr 2018 17:43:22 +0100 Subject: [PATCH] Make component_tag a polymorphic structure --- .../Providers/AppServiceProvider.php | 1 + app/Models/Taggable.php | 65 +++++++++++++++++++ ...2018_04_02_163328_CreateTaggablesTable.php | 42 ++++++++++++ ..._04_02_163658_MigrateComponentTagTable.php | 57 ++++++++++++++++ 4 files changed, 165 insertions(+) create mode 100644 app/Models/Taggable.php create mode 100644 database/migrations/2018_04_02_163328_CreateTaggablesTable.php create mode 100644 database/migrations/2018_04_02_163658_MigrateComponentTagTable.php diff --git a/app/Foundation/Providers/AppServiceProvider.php b/app/Foundation/Providers/AppServiceProvider.php index c652b039..3565247b 100644 --- a/app/Foundation/Providers/AppServiceProvider.php +++ b/app/Foundation/Providers/AppServiceProvider.php @@ -54,6 +54,7 @@ class AppServiceProvider extends ServiceProvider 'metrics' => \CachetHQ\Cachet\Models\Metric::class, 'schedules' => \CachetHQ\Cachet\Models\Schedule::class, 'subscriber' => \CachetHQ\Cachet\Models\Subscriber::class, + 'tags' => \CachetHQ\Cachet\Models\Tag::class, ]); } diff --git a/app/Models/Taggable.php b/app/Models/Taggable.php new file mode 100644 index 00000000..4717de28 --- /dev/null +++ b/app/Models/Taggable.php @@ -0,0 +1,65 @@ + + */ +class Taggable extends Model +{ + /** + * The attributes that should be casted to native types. + * + * @var string[] + */ + protected $casts = [ + 'id' => 'int', + 'tag_id' => 'int', + 'taggable_id' => 'int', + 'taggable_type' => 'string', + ]; + + /** + * The attributes that are mass assignable. + * + * @var array + */ + protected $fillable = [ + 'tag_id', + 'taggable_id', + 'taggable_type', + ]; + + /** + * Get the tag relation. + * + * @return \Illuminate\Database\Eloquent\Relations\BelongsTo + */ + public function tag() + { + return $this->belongsTo(Tag::class); + } + + /** + * Get the taggable relation. + * + * @return \Illuminate\Database\Eloquent\Relations\MorphTo + */ + public function taggable() + { + return $this->morphTo(); + } +} diff --git a/database/migrations/2018_04_02_163328_CreateTaggablesTable.php b/database/migrations/2018_04_02_163328_CreateTaggablesTable.php new file mode 100644 index 00000000..7a05ce3e --- /dev/null +++ b/database/migrations/2018_04_02_163328_CreateTaggablesTable.php @@ -0,0 +1,42 @@ +increments('id'); + $table->integer('tag_id')->unsigned()->index(); + $table->morphs('taggable'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('taggables'); + } +} diff --git a/database/migrations/2018_04_02_163658_MigrateComponentTagTable.php b/database/migrations/2018_04_02_163658_MigrateComponentTagTable.php new file mode 100644 index 00000000..0d33597f --- /dev/null +++ b/database/migrations/2018_04_02_163658_MigrateComponentTagTable.php @@ -0,0 +1,57 @@ +get()->each(function ($tag) { + Taggable::create([ + 'tag_id' => $tag->tag_id, + 'taggable_type' => 'components', + 'taggable_id' => $tag->component_id, + ]); + }); + + Schema::dropIfExists('component_tag'); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::create('component_tag', function (Blueprint $table) { + $table->engine = 'InnoDB'; + + $table->increments('id'); + $table->integer('component_id'); + $table->integer('tag_id'); + + $table->index('component_id'); + $table->index('tag_id'); + }); + } +}