我正在做一个项目,我需要在4个模型之间建立三个多到多的关系。情况如下:
对于所有的数据库专家,我应该如何在Laravel中设计这个数据库模式?我应该有三张不同的枢轴表吗?我应该使用多态关系吗?
我以前使用过多态关系,但是在这个场景中我很难实现它。
发布于 2020-04-14 17:31:12
我会这样做:
常见问题分类表
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');
});我应该使用多态关系吗?
我不认为多态关系在这种情况下会有任何意义。我会坚持标准的多到多。
在您的模型类中,您应该设置所有类似于文档中引用的关系。
你可以这样做:
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');
}
}发布于 2020-04-14 17:02:47
一个问题是FAQ类别和子类别是否应该是不同的表。也许应该是同一个表,这样你就可以选择在将来有更多的等级了。
即
faq_categories(id, parent_id, name etc.)然后,在我看来,你只需要不同的枢轴表。我看不出有什么理由使用多态关系。
https://stackoverflow.com/questions/61212874
复制相似问题