我正在开发一个项目,需要在 4 个模型之间创建三个多对多关系。事情是这样的:
- 常见问题解答类别可以有许多常见问题解答子类别,反之亦然。
- 常见问题解答组可以有许多常见问题解答子类别,反之亦然。
- 常见问题解答可以有多个常见问题解答组,反之亦然。
各位数据库专家,我应该如何在 Laravel 中设计这个数据库模式?我应该有三个不同的数据透视表吗?我应该使用多态关系吗?
我以前使用过多态关系,但在这种情况下我很难实现它。
最佳答案
我会做这样的事情:
常见问题解答类别表
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');
});
正如您所看到的,我不会创建常见问题解答子类别表,因为拥有一个引用父类别的类别表会更干净(对于使外键可以为空以便能够创建顶级类别也很重要) )。
现在要设置表之间的关系,我们可以这样做:
常见问题解答类别 - 常见问题解答组(多对多)
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');
});
Should I use polymorphic relationships?
我认为多态关系在这种情况下没有任何意义。我会坚持使用标准的多对多。
在您的模型类中,您应该设置所有关系,如docs中引用的那样。 .
你可以这样做:
常见问题类别模型
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');
}
}
常见问题解答模型
class Faq extends Model
{
/**
* Get the faq's faq groups.
*/
public function faq_groups()
{
return $this->belongsToMany('App\FaqGroup');
}
}
关于mysql - 疯狂的数据库结构 - 建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61212874/