到目前为止,我的设置是一个客户联系门户,并且有一个Organization,Contact和Note模型。联系人属于组织,组织有许多联系人。我没有遇到任何问题,但是我遇到了一个问题,试图将Notes模型联系起来,以便能够与组织和联系人建立关系。基本上我可以在组织上留下一个注释,但也可以在联系人上留下另一个注释,并能够搜索属于给定联系人或组织的Notes。
我首先想到了一个数据透视表,它存储了模型的ID以及模型类型。我认为与多态数据透视表相同?但是我还没有玩过,不知道从哪里开始。
透视表是否可以这样做?或者是否有更简单的方法,所以我的数据库中没有其他表格?
答案 0 :(得分:2)
您可以尝试使用Polymorphic Relations.
来自文档:
表格结构
多态关系允许模型在单个关联上属于多个其他模型。例如,假设您的应用程序的用户可以“评论”帖子和视频。使用多态关系,您可以对这两种方案使用单个注释表。首先,让我们检查构建这种关系所需的表结构:
posts id - integer title - string body - text videos id - integer title - string url - string comments id - integer body - text commentable_id - integer commentable_type - string
要注意的两个重要列是评论表上的commentable_id和commentable_type列。 commentable_id列将包含帖子或视频的ID值,而commentable_type列将包含拥有模型的类名。 commentable_type列是ORM在访问可注释关系时如何确定要返回的拥有模型的“类型”。
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Comment extends Model { /** * Get all of the owning commentable models. */ public function commentable() { return $this->morphTo(); } } class Post extends Model { /** * Get all of the post's comments. */ public function comments() { return $this->morphMany('App\Comment', 'commentable'); } } class Video extends Model { /** * Get all of the video's comments. */ public function comments() { return $this->morphMany('App\Comment', 'commentable'); } }
在您的情况下,“评论”模型与您的“注释”模型以及您的组织和联系模型中的其他模型(视频和帖子)相对应。
试一试。
在关系中,Laravel不会创建中间表,您应该使用Migrations添加它们。您的Notes表至少应包含以下字段:
- id
:(或note_id
)表格的关键字
- notable_id
:表示组织或联系人的外键
- notable_type
:表示Note对象所引用的模型。 (所以前面的字段知道在表格中应该找到正确的对象)
- 其他注释字段,如title
或description
...