2015-09-06 88 views
0

我想了解一些東西。我有一個有特定領域的項目表。然後我有一個文檔表,它有一個項目的外鍵。爲了證明,我有以下模式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的數據庫中。

如果允許我爲一個項目創建兩個文檔,這是否與一對一關係不矛盾?我如何確保只保存一個文檔,並且下一次訪問項目的顯示頁時,它可能會有一個按鈕來顯示文檔。

感謝

+0

爲什麼不能ü保存專案編號會話,並用它在你製作的看法? –

+0

該文件可能不會立即生成,除非我在這裏忽略了這一點? –

+0

這就顯示了這一點。將projectId存儲在會話中並將其用於創建文檔。當你這樣做時,將documentId存儲在會話中,然後將其用於視圖。 PLZ告訴我,如果你需要示例 –

回答

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和專案編號存儲在會話。現在在showPage中您有另一種形式來製作文檔。但首先檢索ü剛纔這樣創建的項目:

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

現在可以輕鬆地使用項目儘可能多的文件ü希望! 接下來我們假設你註冊了文檔並把documntId放入了會話中。

Session::put('documentId' , $document->id); 
在顯示頁面的頂部

所以只是增加一些檢查:

$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! 
} 
+0

感謝您的信息,幫助了很多。一個問題 - 據我所知,一個會話將持續,而應用程序是開放的。如果我爲項目創建文檔,然後關閉應用程序會發生什麼?下一次我訪問顯示頁面時,因爲沒有文檔會話,它會再次顯示創建表單? –

+1

很高興幫助你!就像我在答案的最後部分所說的那樣,爲了確定是否有任何與項目相關的文檔,您可以簡單地從DB獲取查詢。另一種方法是修復這樣的會話:一種解決方法是檢查您的php.ini文件。你可以定義這個變量:session.gc_maxlifetime。默認情況下,它被設置爲1440.只需發表評論或刪除它。 從這個時候開始,你可以使用session.php配置值正常工作。 –