【问题标题】:Two models to store in database as one transaction两个模型作为一个事务存储在数据库中
【发布时间】:2015-10-22 09:50:34
【问题描述】:

我有两个模型 Item 和 ItemDetail 并且它们具有一对多关系

一对多,因为我将项目详细信息存储为Entity-attribute-value Table,它只是一个表,存储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

当我创建一个 Item 时,它会询问我 Item->name 和 Item->Price,在提交时它会调用 ItemsController@store 并使用新创建的项目 ID 重定向到 ItemDetailController@create。

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

问题:(不像情况那么复杂),问题是我希望它是这样的,如果用户以第一种形式创建项目并且不更新第二种形式的项目详细信息,项目也不应该出现在项目表中。 换句话说,两个存储方法应该是一个事务。

【问题讨论】:

    标签: laravel transactions laravel-5.1


    【解决方案1】:

    解决方案 1:

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

    解决方案 2:

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

    【讨论】:

    • 对不起,但我不明白解决方案 1。但根据您的解决方案 2,我有 ItemDetailsController@store 方法接受 $itemId 但此时 itemId 已存储在项目表中,如果用户中止在提交项目详细信息之前,我有项目但没有项目详细信息。我想避免这种情况。
    • 对于解决方案1,您可以在表单上放置一个按钮,单击该按钮将为ItemDetail 添加一个输入元素。这样您就可以根据需要添加任意数量的ItemDetail。对于解决方案2,如果没有ItemDetail,则可以删除存储的Item。
    【解决方案2】:

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

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

    第一种形式的控制器:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-12
      • 2013-02-18
      • 2019-03-29
      • 2014-06-07
      • 2013-03-24
      • 2012-07-11
      • 2017-10-11
      • 1970-01-01
      相关资源
      最近更新 更多