2015-10-21 28 views
0

我有兩個型號項目ItemDetail,他們有一個一個一對多關係兩種型號在數據庫存儲爲一個交易

一到多,因爲我存儲該項目的詳細信息作爲實體 - 屬性 - 值表,它只不過是一個表中的列,當我創建一個項目存儲ItemDetails如下

id|item_id_fkey|Label   |Value 
1 |1   |Color   |Black 
2 |1   |Description |Item 1 Details 
3 |1   |Size   |2x4x6 
4 |2   |Description |Item 2 Details 
5 |2   |Weight  |1000 

標籤和值也問我用品 - >名用品 - >價格,在提交它調用上述ItemsController @店並重定向到ItemDetailController @創建與新建項目的ID。

ItemDetailsController @創建重定向到與更多的領域收集項目的詳細資料表格(如ItemDetail->描述,ItemDetail->尺寸等),並提交存儲ItemDetails模型。

問題 :(不一樣複雜局面),問題是我希望它是這樣的:如果用戶在第一種形式創建項目並不會更新第二種形式的項目細節,項目不該」 t也出現在Item表中。 換句話說,兩個商店的方法應該是一個單一的交易。

回答

0

解決方案1:

你可以把一切都放在一個表格(可能需要創建動態的HTML元素),使您的控制器的store()方法檢查是否有價值觀爲ItemDetail模型非空數組。如果有值,則創建Item模型和ItemDetail模型,否則中止。

解決方案2:

你可以有你[email protected]方法接受一個$itemId它代表了新創建的Item模型,而且如上所述,檢查是否有價值觀爲ItemDetail模型非空數組(S )然後創建或中止。

+0

對不起,但我不明白解決方案1.但根據你的解決方案2我有'ItemDetailsController @ store'方法接受一個'$ itemId',但這時itemId已經存儲在項目表中,如果用戶在提交之前中止項目詳細信息,我有項目但沒有項目的詳細信息。我想避免這種情況。 – karmendra

+0

對於__Solution 1__,您可以在窗體上放置一個按鈕,單擊它時會爲ItemDetail添加一個輸入元素。這樣,您可以根據需要添加儘可能多的'ItemDetail'。對於__Solution 2__,如果沒有ItemDetail,你可以刪除存儲的I​​tem。 –

0

我假設你所指的兩種形式是在不同的頁面上,因此是對服務器的兩個單獨的請求。

您可以將信息以第一種形式保存在對象中並傳遞給會話。

控制器關於第一類:

public function handleFirstForm() { 

    //perform validation and any other logic 

    $input = Input::get('contentsOfFirstForm'); 

    Session::put('contentsOfFirstForm', $input); 
} 

你把會話的陣列將只用於當客戶進入填寫項目的詳細信息。

控制器的第二形態:

public function handleSecondForm() { 

    $input = Input::get('contentsOfSecondForm');  

    //only save if the second form is not blank 
    if($input!==null) { 

     //run any other logic 

     //Save First Form 
     $item = Session::get('contentsOfFirstForm'); 
     Item::create([$item]); 

     //Save Second Form 
     $itemDetails = $input; 
     ItemDetail::create([$item]); 

    } 
} 

您還可以嘗試使用模型事件,看看第一種形式保存成功做了檢查,也只有這樣,保存第二種形式,以防止情況下,你的第二個模型成功保存,但無論如何都無法保存第一個模型。