我一直在努力应对我的应用并提出了很多问题,在我再进一步之前,我只是想确保我的关系没问题。
所以我创建了一个应用程序,您可以根据您提供的输入生成不同的文档。所以,我创建了一个项目,在该项目中有一个选择字段,它有不同类型的文档。例如,如果我选择DocumentA,则会向用户显示DocumentA的创建表单。如果我选择DocumentB,将显示DocumentB的创建表单。现在虽然这些表单不同并且采用不同的输入,但我想要一种方法,我不必为每种文档类型创建新表。所以我想出了以下内容。
所以在一个项目中,我选择我要创建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吗?
为什么会这样?任何非常感谢的信息或建议。
非常感谢
答案 0 :(得分:1)
我认为问题在于项目与文档之间的关系。你可能有文件belongsTo项目,而项目hasMany文件,因为你可以有很多文件,projectId = 1.不是吗? 我说的没关系,当你编写$ project->文档时,它会为你带来属于该项目的所有文档。这很令人困惑,因为您将关系命名为“文档”而不是“文档”。 你可以做两件事: 1-如果每个项目只能包含1个文档,请将“项目”模型中的关系更改为hasOne Document。然后,如果您执行$ project->文档,它将只为您带来一个。 2-如果您的应用程序允许项目包含多个文档,请将关系保留为hasMany(我建议将其重命名为文档而不是文档),并将$ document对象传递给更新表单,而不是传递$ project并尝试从那里访问该文档。 如果我错过了你的问题并且我完全错了,请告诉我