与laravel elequent交易

时间:2018-01-27 09:53:15

标签: php laravel

我有laravel项目 现在我有项目表连接多ather表 比如item_state item_colors item_barcode等 现在在添加项目的页面中确定 在商店功能我有这个代码

public function store(Request $request)
{
    $item = new Item;
    $item->item_id = $request['item_id'];
    $item->item_desc_ar = $request['item_desc_ar'];
    $item->item_desc_en = $request['item_desc_en'];
    $item->item_default_unit = $request['item_default_unit'];
    $item->item_color = $request['item_color'];
    $item->item_width = $request['item_width'];
    $item->item_length = $request['item_length'];
    $item->item_height = $request['item_height'];
    $item->item_inserter = Auth::user()->id;
    $item->item_state = $request['item_state'];
    $item->item_note = $request['item_note'];
    $item->save();
    $item_barcode = new Item_barcode;
    $item_barcode->item_barcode_item_id = $item->id;
    $item_barcode->item_barcode_barcode = $request->item_barcode;
    $item_barcode->item_barcode_unit = $request->item_default_unit;
    $item_barcode->save();
    foreach($request->category_id as $item_categorys)
    {
        $item_category = new item_category;
        $item_category->category_id = $item_categorys;
        $item_category->item_id = $item->id;
        $item_category->save();
    }
    $item_price = new Item_price;
    $item_price->item_price_item_id = $item->id;
    $item_price->item_price_price = $request->item_price;
    $item_price->item_price_unit_id = $request->item_default_unit;
    $item_price->save();
    $count = 1;
    foreach($request->image as $image)
    {
        if(!empty($image))
        {
            $image_id = $item['id'];
            if(!file_exists(public_path()."/uploads/items/$image_id"))
                File::makeDirectory(base_path()."/public/uploads/items/$image_id");     
            $file = $image;
            $file->move('uploads/items/'.$image_id,$count.'.jpg');
        }
        $count++;
    }
}

现在我想做交易,如果没有添加项目或代码中的任何错误都没有在ather表中发生 就像laravel中的交易一样 但它不适用于elequent模型 谢谢 。

2 个答案:

答案 0 :(得分:1)

在这种情况下,您将讨论数据库事务:

https://laravel.com/docs/5.5/database#database-transactions

您需要在事务闭包中包装您的查询:

DB::transaction(function () {
    DB::table('users')->update(['votes' => 1]);

    DB::table('posts')->delete();
}, 5);

或手动开始交易:

DB::beginTransaction();

如果失败则:

DB::rollBack();

最后:

DB::commit();

成功。

这是一篇详细介绍交易的好文章。

http://fideloper.com/laravel-database-transactions

DB::beginTransaction();

try {
    $item = new Item;
    $item->item_id = $request['item_id'];
    $item->item_desc_ar = $request['item_desc_ar'];
    $item->item_desc_en = $request['item_desc_en'];
    $item->item_default_unit = $request['item_default_unit'];
    $item->item_color = $request['item_color'];
    $item->item_width = $request['item_width'];
    $item->item_length = $request['item_length'];
    $item->item_height = $request['item_height'];
    $item->item_inserter = Auth::user()->id;
    $item->item_state = $request['item_state'];
    $item->item_note = $request['item_note'];
    $item->save();
    $item_barcode = new Item_barcode;
    $item_barcode->item_barcode_item_id = $item->id;
    $item_barcode->item_barcode_barcode = $request->item_barcode;
    $item_barcode->item_barcode_unit = $request->item_default_unit;
    $item_barcode->save();
    foreach($request->category_id as $item_categorys)
    {
        $item_category = new item_category;
        $item_category->category_id = $item_categorys;
        $item_category->item_id = $item->id;
        $item_category->save();
    }
    $item_price = new Item_price;
    $item_price->item_price_item_id = $item->id;
    $item_price->item_price_price = $request->item_price;
    $item_price->item_price_unit_id = $request->item_default_unit;
    $item_price->save();
    $count = 1;
    foreach($request->image as $image)
    {
        if(!empty($image))
        {
            $image_id = $item['id'];
            if(!file_exists(public_path()."/uploads/items/$image_id"))
                File::makeDirectory(base_path()."/public/uploads/items/$image_id");     
            $file = $image;
            $file->move('uploads/items/'.$image_id,$count.'.jpg');
        }
        $count++;
    }
    DB::commit();
} catch (Exception $e) {
    DB::rollBack();
}

答案 1 :(得分:1)

DB::beginTransaction();
try{
   //Code which can  throw error
   DB::commit();
}catch(Exception $e){
   DB::rollBack();
}