Моя динамическая форма использует шаблон лезвия
Код контроллера:
$productPrice=$request->only('unit_id','size_id','color_id','price');
dd($productPrice);
Контроллер дд выхода:
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, используя простой способ ??
В вашей форме вы используете ретранслятор, таким образом, вы не сможете сохранить данные в одной и той же таблице продукта, пока вы не преобразуете данные формы в строку (serialize ()) и не сохраните их в строке ‘price’ в Таблица продуктов, это очень плохой способ хранения данных в БД.
Лучшей практикой для подобных ситуаций является создание новой таблицы для хранения различных цен на продукт, поэтому ваши таблицы должны выглядеть следующим образом.
Таблица продуктов:
| id | name | more columns | created_at | updated_at |
----------------------------------------------------------------------------
| 1 |"product1" | 0 |2016-01-31 00:27:16 |2016-01-31 00:27:16|
| 2 |"product2" | 1 |2016-01-31 00:27:16 |2016-01-31 00:37:16|
| 3 |"product3" | 0 |2016-01-31 00:27:16 |2016-01-31 01:47:04|
Таблица цен на продукты:
| 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');
}
И, конечно же, вам нужно будет сделать Модель ProductPrice, чтобы это отношение заработало.
Лично я бы также добавил отношение в дочернюю модель (модель цены), например:
public function product() {
return $this->belongsTo(Product::class, 'product_id');
}
ОБНОВИТЬ:
Теперь, когда у вас есть эти модели, вы можете создать новый элемент ProductPrice, используя следующий код:
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;
]);
}
Но, как вы можете видеть, этот foreach кажется забавным, потому что вы отправляете данные формы каждого типа цены в виде массива, поэтому для улучшения кода вы можете отправить массив формы следующим образом:
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'],
]);
}
Других решений пока нет …