在我的Web应用程序中,用户可以上传documents或emails到channels。
然后,频道可以具有document_tags和email_tags,所有上传的文档/电子邮件应自动继承。
此外,document_tags与email_tags 将有不同的描述:tag_descriptions。因此,例如,如果我们有一个文档,该文档上载到具有以下标签的频道:animals (id = 1)和pets (id = 2)
Document #55被赞扬为Channel #8。
Document #55会自动继承具有的标签document_tags.channel_id = 55(可以通过以下关系进行访问:)$channel->documenttags。在这种情况下animals和pets。
现在,用户应该能够为teganimals和pets中的设置唯一的描述tag_descriptions,例如:
tag_descriptions
id | taggable_type | taggable_id | typeable_type | typeable_id | description
1 | App\DocumentTag | 1 | App\Document | 55 | My unique description for animals.
2 | App\DocumentTag | 2 | App\Document | 55 | My unique description for pets.
现在,在上面的数据库设计中,上载的document #55具有标签:animals和pets相关联,但是,这两个标签具有唯一的描述,对于特定文档而言是唯一的。
如果我上传另一个文档或一封电子邮件(假设email #20),那么我可以想象它看起来像:
tag_descriptions:
id | taggable_type | taggable_id | typeable_type | typeable_id | description
1 | App\DocumentTag | 1 | App\Document | 55 | My unique description for animals.
2 | App\DocumentTag | 2 | App\Document | 55 | My unique description for pets.
3 | App\EmailTag | 1 | App\Email | 20 | Another unique description for animals.
4 | App\EmailTag | 2 | App\Email | 20 | Yet another unique description for pets.
现在,它们email #20还具有animals和的标签pets,但是在这种情况下,用户可以为标签设置唯一的描述。
现在我的问题是:
上面的设计可行吗,并且在Laravel / PHP中被认为是最佳实践吗?我有点不确定如何构造代码,因为该TagDescription模型突然会具有两个多态关系(taggable和typeable),并且我在文档中找不到任何支持此关系的东西。
此外,我不确定是否可以使用上述设计通过特定的上载文档访问唯一描述,例如:
//In my Document.php model:
public function tagdescriptions()
{
return $this->morphMany(TagDescription::class, 'typeable');
}
然后像这样使用它$document->tagdescriptions。
最后但并非最不重要的一点-我有点不确定如何为特定的taggable_id / taggable_type和唯一的电子邮件/文档保存唯一的标签描述。(typeable_id和typeable_type)。