猿问

Laravel / PHP-高级多态关系

在我的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)。


慕斯王
浏览 114回答 1
1回答
随时随地看视频慕课网APP
我要回答