Как хранить данные из нескольких динамических форм с использованием laravel

Моя динамическая форма использует шаблон лезвия

Код контроллера:

 $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, используя простой способ ??

2

Решение

В вашей форме вы используете ретранслятор, таким образом, вы не сможете сохранить данные в одной и той же таблице продукта, пока вы не преобразуете данные формы в строку (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'],
]);
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]