【问题标题】:How to save associations on an instantiated object如何在实例化对象上保存关联
【发布时间】:2021-10-26 13:17:23
【问题描述】:

如何在保存“父级”之前关联其他关联?我有一辆有很多其他零件的汽车:

  • 一辆车有很多座位
  • 一辆车有很多脚垫
  • 一辆车只有一面镜子

问题是,如果座椅或脚垫有任何缺陷,则无法制造汽车:

$car = new Car(...);

// Many mats
$mats = [new Mat(..), new Mat(..)];

// One mirror
$mirror = new Mirror(..);

// I need to put them all together.
// This does not work
$car->saveMany([$mats, $mirror, $mats]);

// Does not work
$car->mats()->saveMany($mats);
$car->associate($mirror);

// Car should not be saved if either any of its associations have an error.
$car->save();

The docs 在实例化一个新对象然后保存其关联时没有提及此示例:HasMany、HasOne、BelongsTo 等

我看过这些,但无法理解:

如何通过调用“save()”来“关联”“car's”关联?

【问题讨论】:

  • 您说如果其中任何一个关联出现错误则不应保存,但是您如何检查错误?如果某些内容无效,您是否只是让它500?如果数据库中不存在父模型,则无法保存相关模型,您需要拥有父模型的 id 才能进行链接。我认为正确的方法是进行一些全面的验证,然后如果通过,则以正确的顺序(父级,然后是关联)创建模型。
  • 嗨@BrianThompson 正确。问题是,我有一个创建“垫子”的函数。如果垫子的创建失败,我必须找到“汽车”然后删除它,因为我先保存它然后传递它的 ID。也许需要验证。
  • 是的,我的建议是在创建 car 之前验证 mat 数据。然后,如果验证通过,mat 创建应该永远不会失败。所以你可以只创建car 然后mat
  • 谢谢。这很容易做到。

标签: laravel laravel-8


【解决方案1】:

我建议您研究一下 laravel 的验证功能。 (https://laravel.com/docs/8.x/validation)

您可以进行嵌套验证,例如,如果您想验证汽车的座椅,您可以制定如下规则:

public function store(Request $request)
{
    $validated = $this->validate($request, [
        'name' => 'required|string',
        'model' => 'required|exists:car_models,name',

        'seats' => 'required|array',
        'seats.*.color' => 'required',
        'seats.*.width' => 'numeric',
        'seats.*.fabric' => 'required|string',
    ]);

    // create the car with all relation data

    return $car;
}

可以如上所示进行验证,也可以通过表单请求验证 (https://laravel.com/docs/8.x/validation#form-request-validation)。

这样,您可以确保用户输入是有效的,并且可以在创建任何模型之前工作。之后,您应该创建汽车并添加所有关系。但是,我建议您改用雄辩的关系,这样您就可以编写类似

// Create relation model with array of data
$car->seats()->create($seatData);

// Create relation models with collection of data
$car->seats()->createMany($seatsDataCollection);

【讨论】:

    猜你喜欢
    • 2012-01-20
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    相关资源
    最近更新 更多