【问题标题】:Laravel 5 - defining relationshipsLaravel 5 - 定义关系
【发布时间】:2015-12-17 02:20:17
【问题描述】:

使用单个模型一切正常,但现在我正在实施更多,我注意到了一个问题。

我有几个代表不同类型文档的文档模型。现在,假设我有 DocumentA 和 DocumentB。

每个文档都允许文件上传,所以我创建了一个文件上传模型。一个 Document 可以有多个 FileUploads。

所以,在这一点上看起来很简单。我的 FileUpload 表有一个 documentId 字段,它是对正在使用它的 Document 的 id 字段的引用。

在 DocumentA 中,我有类似的东西

public function uploadFile()
{
    return $this->hasMany('App\UploadFile', 'documentId');
}

所以 DocumentA 可以有多个 UploadFiles,由 documentId 链接。

DocumentB 在其模型中具有相同的功能。

我的问题在于 UploadFiles 模型。首先,这个模型现在有两个belongTo事件,例如

public function documentA()
{
    return $this->belongsTo('App\DocumentA', 'documentId');
}

public function documentB()
{
    return $this->belongsTo('App\DocumentB', 'documentId');
}

这可能是问题所在,不确定我是否可以拥有多个属于?然而,我的直接问题与 doc_file 表的迁移有关。目前我有这个

Schema::table('doc_file', function (Blueprint $table) {
    $table->integer('documentId')->unsigned()->default(0);
    $table->foreign('documentId')->references('id')->on('document_a')->onDelete('cascade');
});

Schema::table('doc_file', function (Blueprint $table) {
    $table->integer('documentId')->unsigned()->default(0);
    $table->foreign('documentId')->references('id')->on('document_b')->onDelete('cascade');
});

所以我正在尝试为我的文档提供外键。当我尝试迁移时,它告诉我

列已存在:1060 列名 documentId 重复

我是否正确处理了我的人际关系?本质上,我有很多文档,每个文档可以有很多文件。

感谢任何有关我的数据库关系的帮助。

非常感谢

【问题讨论】:

    标签: laravel-5


    【解决方案1】:

    乍一看你的问题,对于model这个概念,你似乎有点困惑。

    模型概念

    模型实际上是现实世界对象的概念化,因为它用于表示现实世界的实体。

    换句话说,它代表了一整类具有相似属性的对象。例如,汽车模型将代表所有汽车,无论它们是 Lamborghini 还是 Mercedez 类型。事实上,它们全部都属于汽车分类。

    Eloquent 和您的用例也有同样的概念;因此,Document 模型足以代表您的两个文档(DocumentA 和 DocumentB)。

    雄辩的关系

    为了完善您迄今为止所取得的成就,您的模型的关系可以这样重构:

    文档模型

    public function fileUploads(){
        return $this->hasMany('App\FileUpload');
    }
    

    文件上传模型

    public function document(){ 
        return $this->belongsTo('App\Document');
    }
    

    基于关系“EACH document has MANY file uploads”,反之“EACH file upload BELONGS to just one document”,如您所见,有只是一个 FileUpload模型中的belongsTo()方法来定义后半部分的关系。

    同样,定义上述关系的表的架构如下:

    // Schema for Document table
    Schema::table('document', function (Blueprint $table) { 
        $table->increment('id'); 
        $table->string('name', 100);
    });
    
    // Schema for FileUpload table
    Schema::table('doc_file', function (Blueprint $table) { // file_uploads would have been a more friendly name in my opinion
        $table->integer('documentId')->unsigned()->default(0);   // note that `documentId` is interpreted as `documentid` in MySQL
        $table->foreign('documentId')->references('id')->on('document')->onDelete('cascade');
    });
    

    【讨论】:

    • 感谢您的详细解答。然而有一件事。我有几个 Document 模型,因为每个文档都是独一无二的。这将如何适应这种情况?
    • 为了进一步澄清,每个文档都有不同的输入。我想不出使用单个 Document 模型的方法,因为它们是如此独特。
    • 您能否简要说明是什么(输入)使这些文档具有独特性?即使您的文档是唯一的,它们的唯一性也可以通过主键来确定。
    • 例如,一个文档有 3 个普通输入和一个文本区域。另一个文档接受日期、文本字段和选择字段。我看不出一个文档模型如何代表所有这些文档,因为它们没有采用相同的数据。
    • 在这种情况下,您有两个选择:1 将另一个字段添加到您的 Document 模型中,该模型包含文档的结构,可以通过将结构获取为 PHP 数组,然后json_encodeing 将其存储起来。 2 创建另一个模型(例如 DocStructure 用于相同目的,并将此模型与您的 Document 模型的关系定义为 一对一
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 2019-05-07
    • 1970-01-01
    • 2017-01-05
    • 1970-01-01
    相关资源
    最近更新 更多