Simpan data dalam loop foreach di laravel 5.8

Saya membutuhkan bantuan Anda dengan situasi saya dalam menyimpan data.

Saya mendapat keranjang berisi beberapa produk, dan sekarang saya ingin menyimpan semua produk ini di tabel Order secara bersamaan dengan mengklik tombol kirim

Pandangan saya blade.php

Tampilan ini menunjukkan semua produk di keranjang dan saya perlu menyimpan informasi ini di Ordertabel

<form action="{{route('order.store')}}" method="post">
  @csrf
  @foreach ($cart as $ct)

  <input type="text" name="product_id" value="{{$ct->id}}" hidden>

  <input type="text" value="{{$ct->color}}" name="color" >

  <input type="text" value="{{$ct->size}}" name="size" >

  <input type="text" value="{{$ct->price}}" name="price" >

  @endforeach
 <button type="submit">submit</button>            
</form>

Di tabel Order saya, saya mendapatkan 4 kolom yang harus diisi: product_id, color, size dan price.

Loop foreach saya mengambil data dari tabel Cart dan semua data ditampilkan tanpa kesalahan.

Pertanyaan saya adalah Bagaimana saya bisa menyimpan data ini ke tabel Order saya hanya dengan mengklik tombol kirim sekali? Apa yang harus saya tulis di store function di OrderController?

Jika keranjang saya memiliki 3 produk maka nilai yang saya harapkan adalah Order tabelnya akan terlihat seperti ini:

id----product_id----size----color---price---+
---------------------------------------------
1      1             abc     xyz     123
---------------------------------------------
2      2             abc2    xyz2    456
---------------------------------------------
3      3             aaa     bbb     789

Terima kasih atas bantuanmu!


person Tùng Nguyễn    schedule 29.10.2019    source sumber
comment
Ini sepertinya agak luas. khususnya apa yang membuat Anda kesulitan? Apa yang sudah kamu coba? Apakah Anda melakukan sesuatu seperti ini?   -  person Patrick Q    schedule 29.10.2019
comment
Saya tidak akan menaruhnya di tabel Pesanan. Buat tabel baru untuk Item Pesanan, masukkan semua kolom yang Anda perlukan (id_pesanan, id_produk, warna, ukuran, harga, jumlah, dll), dan simpan item di sana.   -  person aynber    schedule 29.10.2019
comment
Saya tahu cara menyimpan produk tertentu tetapi di sini saya ingin menyimpan 2-3 produk atau lebih secara bersamaan   -  person Tùng Nguyễn    schedule 29.10.2019
comment
@aynber ya, tetapi hanya menyimpan 1 produk untuk tombol kirim sekali klik dan saya ingin menyimpan beberapa item sekaligus, saya baru saja mengedit pertanyaan saya untuk lebih spesifik, semoga Anda dapat membantu!   -  person Tùng Nguyễn    schedule 29.10.2019


Jawaban (2)


DB:

Order:
    user_id
    created_at
    ...


orderProducts:
    price
    color
    size
    order_id (relation)
    product_id (relation)
    ...

Melihat

<form action="{{route('order.store')}}" method="post">
  @csrf
  @foreach ($cart as $ct)

  <input type="text" name="products[]" value="{{$ct->product_id}}" hidden>

  <input type="text" value="{{$ct->color}}" name="color[]"  >

  <input type="text" value="{{$ct->size}}" name="size[]" >

  <input type="text" value="{{$ct->price}}" name="price[]" >

  @endforeach
 <button type="submit">submit</button>            
</form>

penyimpanan fungsi pengontrol

        $order= new Order;// change the model here
        // .. complete your information's like user id or created_at 
        $order->save();

        foreach($request->products as $key=>$product_id)
        {
            $product = Product::findOrFail($product_id); // validations the product id 

            // get your information's from db (color,size,price) don't trust get information's from user .
            // $product->price , $product->color .... or get from cart 
           //from cart direct $color[$key] or $price[$key] or $size[$key]  "I don't recomend to use this point"


            // must be create new table
            $orderProducts=new orderProducts; // create new table ordersProducts

            $orderProducts->price = $product->price;
            // .. complete your information's

            $orderProducts->order_id = $order->id; // primary key
            $orderProducts->product_id= $product->id;

            $orderProducts->save();

        }

Pemberitahuan: - Anda perlu menggunakan try-catch untuk mencatat info agar jika gagal pada langkah "findOrFail" atau ubah menjadi find dan kemudian jika produk tidak ditemukan dalam tabel maka catat pesanan tidak lengkap dan tampilkan kesalahan kepada pengguna

person Mahmoud Gad    schedule 29.10.2019
comment
Saya bisa memasukkan beberapa produk sekaligus, namun dengan cara ini saya hanya bisa mendapatkan data dari tabel Produk, Bagaimana cara mendapatkan data dari formulir data keranjang? - person Tùng Nguyễn; 30.10.2019
comment
@TùngNguyễn hmm maaf saya tidak mengerti maksud Anda. Koreksi saya jika saya salah Anda perlu mendapatkan warna dan ukuran serta harga langsung dari troli tanpa mengambil dari database? - person Mahmoud Gad; 30.10.2019
comment
Ya, saya ingin mendapatkan data langsung dari kolom di atas. Meskipun data tersedia, namun dapat diubah oleh pengguna. Lalu ketika perubahan dilakukan, bagaimana saya bisa menyimpannya? - person Tùng Nguyễn; 30.10.2019

Jawaban saya sangat mirip dengan jawaban di atas tetapi saya hanya ingin menerapkan pendekatan berbeda di sini dengan Transaksi Basis Data, Coba Tangkap & Sisipkan Massal (untuk mencegah penempatan kueri dalam lingkaran)

try {
       DB::begintransaction();
       $order = Order::create($orderData); // change the model here


   $orderProductsData = [];
   foreach($request->products as $product_id) {
        $product = Product::find($product_id); // validations the product id
        $orderProductsData[] = $tmpData = [
            'price' => $product->price,
            'order_id' => $order->id,
            'product_id' => $product->id;
        ];
        // must be create new table

        // You can also store this way, but its still in loop so putting under comment.
        // $orderProducts = orderProducts::create($tmpData); 

    }

    orderProducts::insert($orderProductsData);

  DB::commit();
} catch (Exception $e) {
   DB::rollback();
   thow $e; // modify with, How you handle your error response.
}

Sekali lagi, jawaban di atas sepenuhnya benar, Namun hanya menggunakan pendekatan yang berbeda, yang menurut saya sedikit lebih optimal.

person Vishal Tarkar    schedule 30.10.2019