Laravel 5 - 按顺序保存db中的模型

时间:2017-06-28 13:03:14

标签: laravel laravel-eloquent

所以我在这里问你一个逻辑问题。

所以我有一个 Car 模型,其中包含以下属性: id,name,description

然后我有第二个名为 CarOptional 的模型,它实际上是第三个可选模型的关系模型,它具有以下属性: id_optional,id_car

然后我有第三个模型 CarColours (我们假装它是与 carOptional 类似的表格),带有 id_colour,id_car 属性。

现在我要保存一辆新车,所以我会选择这种方法 $car = Car :: create (arraydatas)

在db上保存我的数据我有我的车型,所以我可以拥有她的身份并拯救CarOptional es。

ForEach ($ optionals as $ optional) {
   CarOptional :: create (array ("id_car" => $ car-> id, "id_optional" => $ optional-> id))
}

所以,我对 CarColours 模型做了同样的事情,所以使用create方法循环,​​但我要问的是:

如何处理CarOptional的创建错误(例如),然后停止所有后续创建,我想要"删除"在db上以前保存过,并返回错误?

1 个答案:

答案 0 :(得分:1)

您要求的是:Transactions

<?php
namespace ProjectName\Whatever\Mappers;

final class CarMapper {

    public function createCar($car, $optionals, $colors) {
        DB::transaction(function () use($car, $optionals, $colors) {
            $this->createOptionals($car, $optionals);
            $this->createColors($car, $colors);
        });
    }

    private function createOptionals($car,$optionals) {
            foreach($optionals as $optional) {
                CarOptional::create([
                    'id_car' => $car->id,
                    'id_optional' => $optional->id
                ]);
            }
    }

    private function createColors($car,$optionals) {
        foreach($colors as $color) {
            CarColour::create([
                'id_car' => $car->id,
                'id_colors' => $color->id
            ]);
        }

    }
}

简单来说:使用SQL事务,如果在事务中间出现问题,则不会提交任何内容。您不需要关心&#34; 然后停止所有后续创建,我是否想要删除&#39;在db上先前保存的&#34;。

这是你应该关注的部分:

DB::transaction(function () {
    // ... 
});