Laravel 5处理一对一的关系

时间:2015-09-06 19:26:40

标签: laravel-5

我想了解一些事情。我有一个项目表,其中包含某些字段。然后我有一个文档表,它有一个项目的外键。为了演示,我有以下模式

Schema::create('projects', function (Blueprint $table) {
    $table->increments('id');
    $table->string('contactName')->default('');
    $table->string('projectName')->default('');
    $table->timestamps();
});

Schema::create('document', function(Blueprint $table)
{
    $table->increments('id');
    $table->longText('documentType')->default('');
    $table->longText('documentContent')->default('');
    $table->integer('projectId')->unsigned()->default(0);
    $table->foreign('projectId')->references('id')->on('projects')->onDelete('cascade');
    $table->timestamps();
});

我的项目模型然后有以下

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

我的文档模型有以下内容

public function project()
{
    return $this->belongsTo('App\Project', 'projectId');
}

所以项目可以有一个文档。这是我想要了解的内容。我的文档是在项目之后创建的。首先,我通过填写链接到项目创建功能的表单来创建项目。完成后,我将被带到那个项目展示页面。在显示页面上,我有一个表单来完成文档

{!! Form::model(new App\Document, 
    [
        'class'=>'form-horizontal',
        'route' => ['document.store', $project->id]
    ]) 
!!}

<div class="form-group">
    {!! Form::label('documentType', 'Document Type:', array('class' => 'col-sm-5 control-label blue')) !!}
    <div class="col-sm-7">
        {!! Form::textArea('documentType', null, array('class' => 'form-control')) !!}
    </div>
</div>
<div class="form-group">
    {!! Form::label('documentContent', 'Document Data:', array('class' => 'col-sm-5 control-label blue')) !!}
    <div class="col-sm-7">
        {!! Form::textArea('documentContent', null, array('class' => 'form-control')) !!}
    </div>
</div>
<div class="form-group">
    {!! Form::submit('Save Data', ['class' => 'btn btn-primary']) !!}
</div>

{!! Form::close() !!}

因此调用文档存储函数将数据保存到数据库中。

一切正常,数据保存以及projectId,因此我可以将文档链接到项目。但是,如果我现在再次访问该项目的显示页面,我会有一个空表单。如果我填写此表单,它会将第二行保存到数据库中,该数据库与第一行具有相同的projectId。

如果允许我为项目创建两个文档,这是否与一对一关系相矛盾?如何确保只保存一个文档,下次访问项目的显示页面时,可能会有一个按钮来显示文档。

由于

1 个答案:

答案 0 :(得分:1)

假设您为了制作项目而这样做:

$project = new Project();
$project->contactName = 'something';
$project->projectName = 'somethingElse';
$project->save(); //So you will have the id now!

return redirect()->intended('showPage')->with('project_id'  , $project->id);

因此,您被重定向到showPage,而projectId存储在会话中。现在在showPage中,您有另一个表单来制作文档。但首先检索刚刚创建的项目:

if(session()->has('project_id')){
    $pId = session('project_id');
    $project = Project::find($pId);
}

现在可以轻松使用该项目为您想要的多个文件! 接下来我们假设你注册了文档并将documntId放在会话中。

Session::put('documentId' , $document->id);

所以在showPage的顶部只需添加一些检查:

$result = DB::table('document')
          ->where(['id'=>Session::get('documentId') , 'projectId'=>$project->id])->get();
if($result != null){
// so just show the information not the submit form!
}
else{
 //show the form to submit the document!
}