两个模型作为一个事务存储在数据库中

时间:2015-10-21 11:03:03

标签: laravel transactions laravel-5.1

我有两个模型项目项目详情,他们有一个一对多关系

一对多,因为我将项目详细信息存储为实体属性值表,它只是一个表,其中存储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

当我创建项目时,它会询问我项目 - >名称项目 - >价格,在提交时调用< strong> ItemsController @ store 并使用新创建的项目ID重定向到 ItemDetailController @ create

ItemDetailsController @ create 重定向到包含更多字段的表单以收集项目详细信息(例如ItemDetail-&gt; Description,ItemDetail-&gt; Dimensions等),并在提交时存储ItemDetails模型

问题 :( 没有情况那么复杂),问题是我希望它是这样的,如果用户以第一种形式创建项目而不更新第二种形式的项目详细信息,项目也不应出现在项目表格中。 换句话说,两个商店方法应该是一个单一的交易。

2 个答案:

答案 0 :(得分:0)

解决方案1:

您可以将所有内容放在一个表单中(可能需要创建动态HTML元素)并使控制器的store()方法检查ItemDetail模型是否存在非空数组值。如果有值,则创建Item模型和ItemDetail模型,否则中止。

解决方案2:

您可以让ItemDetailsController@store方法接受表示新创建的$itemId模型的Item,并且如上所述,检查{{是否存在非空数组值1}}模型然后创建或中止。

答案 1 :(得分:0)

我假设您所指的两个表单位于不同的页面上,因此是对服务器的两个单独请求。

您可以将第一种形式的信息保存在对象中并将其传递给会话。

First Form的控制器:

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]);

    }
}

您可能还想使用模型事件进行检查以查看第一个表单是否已成功保存,然后仅保存第二个表单,以防止第二个模型成功保存,但第一个模型无论出于何种原因都可以不被保存。