例如,我有两个模型:
Product
和
ProductSpec
ProductSpec 是产品的规范,您的主键与产品相同。
所以,当我去保存ProductSpec时,我会这样做:
$product = new Product;
$product->name = $name;
$product->save();
$productSpec = new ProductSpec;
$productSpec->product_id = $product->id;
$productSpec->value = $value;
$success = $productSpec->save();
// in case of ProductSpec validation errors
if ( $success !== true ) {
$product->delete();
}
我的验证规则在模型中。问题是当我在 ProductSpec 保存时遇到一些验证错误时,应用程序将中止,我无法删除产品模型。
拜托,怎么解决这个问题?或者还有另一种方法可以验证ProductSpec,如果是,则保存吗?
答案 0 :(得分:1)
您需要将这两个操作包装在一个数据库事务中。这样,要么保存两个对象,要么都不保存。
这样可以解决问题:
DB::transaction(function () use ($name, $value) {
$product = new Product;
$product->name = $name;
$product->save();
$productSpec = new ProductSpec;
$productSpec->product()->associate($product);
$productSpec->value = $value;
$productSpec->save();
});
您可以在此处详细了解Eloquent中的交易:http://laravel.com/docs/5.1/database#database-transactions