Laravel模型与2种不同的模型有关系

时间:2017-11-15 15:01:12

标签: php laravel-5 relational-database

到目前为止,我的设置是一个客户联系门户,并且有一个Organization,Contact和Note模型。联系人属于组织,组织有许多联系人。我没有遇到任何问题,但是我遇到了一个问题,试图将Notes模型联系起来,以便能够与组织和联系人建立关系。基本上我可以在组织上留下一个注释,但也可以在联系人上留下另一个注释,并能够搜索属于给定联系人或组织的Notes。

我首先想到了一个数据透视表,它存储了模型的ID以及模型类型。我认为与多态数据透视表相同?但是我还没有玩过,不知道从哪里开始。

透视表是否可以这样做?或者是否有更简单的方法,所以我的数据库中没有其他表格?

1 个答案:

答案 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对象所引用的模型。 (所以前面的字段知道在表格中应该找到正确的对象) - 其他注释字段,如titledescription ...