如何使用laravel存储来自多个动态表单的数据

时间:2016-11-09 19:26:55

标签: php laravel laravel-5.3 laravel-blade dynamic-forms

My Dynamic form use blade template

控制器代码:

 $productPrice=$request->only('unit_id','size_id','color_id','price');
        dd($productPrice);

控制器dd输出:

    array:4 [▼
  "unit_id" => array:3 [▼
    0 => "3"
    1 => "7"
    2 => "1"
  ]
  "size_id" => array:3 [▼
    0 => "2"
    1 => "1"
    2 => "4"
  ]
  "color_id" => array:3 [▼
    0 => "1"
    1 => "6"
    2 => "9"
  ]
  "price" => array:3 [▼
    0 => "32000"
    1 => "4280"
    2 => "5655"
  ]
]

如何在product_price表中存储数据使用laravel easy方法??

1 个答案:

答案 0 :(得分:1)

在您的表单中使用转发器,这样您就无法将数据存储在产品的同一个表中,除非您将表单数据转换为字符串(serialize())并将其存储在一个价格'产品表中的行,这是在数据库中存储数据的非常糟糕的方式。

此类情况的最佳做法是制作一个新表格来存储产品的不同价格,因此您的表格应如下所示。

产品表:

|  id  |  product_id | unit | size | color | price |created_at| updated_at |
----------------------------------------------------------------------------
|   1  |      1      |  0   |  3   |   2   |   421 |2016-01.. |2016-01..   |
|   2  |      1      |  3   |  2   |   5   |   121 |2016-01.. |2016-01..   |
|   3  |      1      |  4   |  4   |   1   |   531 |2016-01.. |2016-01..   |

产品价格表:

public function prices() {
    return $this->hasMany(ProductPrice::class, 'product_id');
}

所以这样,产品可以拥有任意数量的价格,那么你唯一需要做的就是在这些表的模型中建立关系。

在产品型号中,您可以添加:

public function product() {
    return  $this->belongsTo(Product::class, 'product_id');
}

当然,您必须制作ProductPrice模型才能使这种关系发挥作用。

就个人而言,我还会在子模型(价格模型)中添加一个reation,如下所示:

foreach($productPrice['unit_id'] as $k => $unit) {
    $product->prices()->create([
        'unit' => $productPrice['unit_id'][$k]
        'size' => (isset($productPrice['size_id'][$k])) $productPrice['size_id'][$k] ? : 0;
        'color' => (isset($productPrice['color_id'][$k])) $productPrice['color_id'][$k] ? : 0;
        'price' => (isset($productPrice['price'][$k])) $productPrice['price'][$k] ? : 0;
     ]);
}

<强>更新

现在您已拥有这些模型,您可以使用以下代码创建新的ProductPrice项目:

productPrice[][unit_id]
productPrice[][size_id]
productPrice[][color_id]
productPrice[][price]

但正如您所看到的,这个foreach似乎很有趣,这是因为您将每种价格类型的表单数据作为数组发送,因此为了使代码更清晰,您可以发送表单数组,如下所示:

$productPrices = $request->only('productPrice');

foreach($productPrices as $productPrice) {
    $product->prices()->create([
        'unit'   => $productPrice['unit_id'],
        'size'   => $productPrice['size_id'],
        'color'  => $productPrice['color_id'],
        'price'  => $productPrice['price'],
    ]);
}

那么你的foreach代码将如下所示:

Code