У меня есть стол contents
который имеет много типов, например posts
, albums
, videos
,
миграция таблицы содержания:
Schema::create('contents', function (Blueprint $table) {
$table->increments('id');
$table->integer('ref_id')->index();
$table->integer('type')->index();
$table->string('title', 255);
$table->text('description');
$table->boolean('published')->default(false);
$table->string('thumb', 255);
$table->timestamps();
});
и посты таблицы миграции:
Schema::create('posts', function (Blueprint $table) {
$table->increments('id');
$table->text('body');
});
та же идея относится ко всем другим типам, таким как видео:
Schema::create('videos', function (Blueprint $table) {
$table->increments('id');
$table->string('youtube_id', 255);
});
Чтобы получить полный контент сейчас, я использую отношение hasMany:
class Content extends Model
{
public function posts() {
return $this->hasMany('App\Post','id' ,'ref_id');
}
public function videos() {
return $this->hasMany('App\Video','id' ,'ref_id');
}
...
}class Post extends Model
{
public function content() {
return $this->belongsTo('App\Content', 'id' , 'ref_id')->where('type','1');
}
}class Video extends Model
{
public function content() {
return $this->belongsTo('App\Content', 'id' , 'ref_id')->where('type','3');
}
}
Как видите, я добавил вручную types
где каждый тип имеет номер, например, контент с типом 1 предназначен для публикаций, контент с типом 3 предназначен для видео и т. д.
Я чувствую, что моя структура не так хороша и может быть улучшена. Я столкнулся с Полиморфными Отношениями в документации, и я не знаю, будет ли это хорошо для моего случая или нет.
Любой совет?
Задача ещё не решена.
Других решений пока нет …