Laravel 5 - 建立关系

时间:2016-01-07 22:28:31

标签: laravel-5 laravel-5.1

我一直在努力应对我的应用并提出了很多问题,在我再进一步之前,我只是想确保我的关系没问题。

所以我创建了一个应用程序,您可以根据您提供的输入生成不同的文档。所以,我创建了一个项目,在该项目中有一个选择字段,它有不同类型的文档。例如,如果我选择DocumentA,则会向用户显示DocumentA的创建表单。如果我选择DocumentB,将显示DocumentB的创建表单。现在虽然这些表单不同并且采用不同的输入,但我想要一种方法,我不必为每种文档类型创建新表。所以我想出了以下内容。

Design

所以在一个项目中,我选择我要创建DocumentA。然后我显示了视图documentA.create。此视图具有文档名称和描述的隐藏输入。表单字段标签是document_data表中的键,值是此字段的输入。因此,如果我创建DocumentA,我的数据库可能看起来像这样

project

 id | projectName  | 
------------------
 1  | Project One  | 
------------------

document

 id | projectId  | documentName |
--------------------------------
 1  | 1          | DocumentA    |
--------------------------------


document_data

 id | documentId | key         |  value      |  
----------------------------------------------
 1  | 1          | clientName  |  Google     |   
----------------------------------------------
 2  | 1          | projectName |  Analytics  |  
----------------------------------------------
 3  | 1          | Contact     |  Mr Sharp   |  
----------------------------------------------
 4  | 1          | startDate   |  29/12/2016 |  
----------------------------------------------

目前我正在努力的是外键documentId位于document_data表中。但是,只有在我的两个Models类中都设置了一个外键,例如。

,这些东西才有效
class Document extends Model
{
    protected $table = 'documents';
    protected $guarded = [];

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

class DocumentData extends Model
{
    protected $table = 'document_data';
    protected $guarded = [];

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

如果我不在两个类中设置它,我得到一个MethodNotAllowedHTTP异常,但没有关于它的信息。我已经能够毫无问题地创建文档,当我需要更新时问题就出现了。 DocumentA的编辑页面有一个这样的表格

{{ $document }}

{!! Form::model($project->document, [
    'class'=>'form-horizontal',
    'method' => 'PATCH',
    'route' => ['projects.documents.update', $project, $project->document]
]) !!}

现在,当我输出上面的$ document时,我得到了正在处理的正确文档,正如我应该做的那样。但是,在更新功能中,如果我自己输出$ document或者我输出

public function update(Request $request, Project $project, Document $document)
{
    dd($project->document);

    return null;
}

我同时看到DocumentA和DocumentB。更新只能通过DocumentA吗?

为什么会这样?任何非常感谢的信息或建议。

非常感谢

1 个答案:

答案 0 :(得分:1)

我认为问题在于项目与文档之间的关系。你可能有文件belongsTo项目,而项目hasMany文件,因为你可以有很多文件,projectId = 1.不是吗? 我说的没关系,当你编写$ project->文档时,它会为你带来属于该项目的所有文档。这很令人困惑,因为您将关系命名为“文档”而不是“文档”。 你可以做两件事: 1-如果每个项目只能包含1个文档,请将“项目”模型中的关系更改为hasOne Document。然后,如果您执行$ project->文档,它将只为您带来一个。 2-如果您的应用程序允许项目包含多个文档,请将关系保留为hasMany(我建议将其重命名为文档而不是文档),并将$ document对象传递给更新表单,而不是传递$ project并尝试从那里访问该文档。 如果我错过了你的问题并且我完全错了,请告诉我