Я бы сделал что-то вроде этого:
Таблица категорий часто задаваемых вопросов
Schema::create('faq_categories', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
});
Schema::table('faq_categories', function (Blueprint $table) {
$table->unsignedInteger('parent_id')->nullable();
$table->foreign('parent_id')->references('id')->on('faq_categories')->onDelete('cascade');
});
Таблица групп часто задаваемых вопросов
Schema::create('faq_groups', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
});
Таблица часто задаваемых вопросов
Schema::create('faqs', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
});
Как вы можете видеть, я бы не стал создавать таблицу подкатегорий часто задаваемых вопросов, потому что было бы чётко иметь таблицу категорий, ссылающуюся на родительскую категорию (также важно, чтобы этот внешний ключ мог обнуляться, чтобы иметь возможность создавать категорию верхнего уровня).
Теперь, чтобы настроить отношения между таблицами, мы можем сделать это:
FAQ Категории - Группы часто задаваемых вопросов (многие ко многим)
Schema::create('faq_category_faq_group', function (Blueprint $table) {
$table->increments('id');
$table->unsignedInteger('faq_category_id');
$table->foreign('faq_category_id')->refrences('id')->on('faq_categories')->onDelete('cascade');
$table->unsignedInteger('faq_group_id');
$table->foreign('faq_group_id')->refrences('id')->on('faq_groups')->onDelete('cascade');
});
Часто задаваемые вопросы - группы часто задаваемых вопросов (многие ко многим)
Schema::create('faq_faq_group', function (Blueprint $table) {
$table->increments('id');
$table->unsignedInteger('faq_id');
$table->foreign('faq_id')->refrences('id')->on('faqs')->onDelete('cascade');
$table->unsignedInteger('faq_group_id');
$table->foreign('faq_group_id')->refrences('id')->on('faq_groups')->onDelete('cascade');
});
Должен ли я использовать polymorphi c отношения?
Я не думаю, что полиморфные c отношения имели бы какой-то смысл в этом сценарии. Я бы придерживался стандарта многие ко многим.
В ваших модельных классах вы должны настроить все отношения, как указано в документах .
Вы можете сделать это:
FaqCategory Модель
class FaqCategory extends Model
{
/**
* Get the category's parent category.
*/
public function parent()
{
return $this->belongsTo('App\FaqCategory');
}
/**
* Get the category's sub categories.
*/
public function sub_categories()
{
return $this->hasMany('App\FaqCategory', 'parent_id');
}
/**
* Get the category's faq groups.
*/
public function faq_groups()
{
return $this->belongsToMany('App\FaqGroup');
}
}
FaqGroup Модель
class FaqGroup extends Model
{
/**
* Get the group's faq categories.
*/
public function faq_categories()
{
return $this->belongsToMany('App\FaqCategory');
}
/**
* Get the group's faqs.
*/
public function faqs()
{
return $this->belongsToMany('App\Faq');
}
}
Faq Модель
class Faq extends Model
{
/**
* Get the faq's faq groups.
*/
public function faq_groups()
{
return $this->belongsToMany('App\FaqGroup');
}
}