Pada Slim4 Tutorial API: 5 Database Transaction, akan dibahas bagaimana menggunakan transaction, commit, dan rollback pada Slim4. Setelah pengguna berhasil melakukan autentikasi pada middleware, kemudian melakukan pemesanan produk. Sistem bisa saja menyimpan data pemesanan pada beberapa tabel sekaligus. Sebagai contoh pengguna memesan barang berupa baju, jaket dan celana. Selain menyimpan daftar barang belanjaan dari pengguna, sistem juga akan menyimpan alamat tujuan yang akan digunakan sebagai alamat pengiriman, riwayat pengiriman, dan lain sebagainya.
Pengenalan database transaction
Database transaction merupakan sebuah proses dimana database akan menyimpan atau mengubah data pada tabel (commit) ketika tidak ada kesalahan dalam proses (transaction). Namun jika terjadi kesalahan dalam proses menyimpan atau mengubah data, maka database akan mengembalikan data kedalam bentuk semula (rollback). Contoh database yang akan digunakan dalam melakukan database transaksi sebagai berikut:
Bisa menggunakan contoh data sebagai berikut:
# user_address
INSERT INTO `fashion_store_db`.`user_address` (`user_id`, `address`) VALUES ('1', 'User 1 Address');
# category
INSERT INTO `fashion_store_db`.`category` (`category`) VALUES ('Clothing');
INSERT INTO `fashion_store_db`.`category` (`category`) VALUES ('Shoes');
INSERT INTO `fashion_store_db`.`category` (`category`) VALUES ('Watches');
# product
INSERT INTO `fashion_store_db`.`product` (`category_id`, `name`, `stock`, `price`, `status`) VALUES ('1', 'Jacket', '4', '200000', '1');
INSERT INTO `fashion_store_db`.`product` (`category_id`, `name`, `stock`, `price`, `status`) VALUES ('1', 'T-shirt', '8', '100000', '1');
INSERT INTO `fashion_store_db`.`product` (`category_id`, `name`, `stock`, `price`, `status`) VALUES ('2', 'Boots', '1', '150000', '1');
Script database lengkap bisa dilihat melalui Github.
Penerapan pada Order API
Sebelum menggunakan database transaction pada Slim4, diperlukan model beberapa model yang akan digunakan sebagai media menampung object atau request. Selanjutnya data tersebut akan disimpan pada database. Sebagai contoh nama model yang akan digunakan adalah Order dan OrderDetail.
Model Order digunakan untuk menyimpan data pada tabel order, data berupa pengguna, alamat pengguna, dan status pesanan.
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Order extends Model
{
protected $table = 'order';
protected $primaryKey = 'id';
}
Model OrderDetail yang menggunakan tabel order_detail akan digunakan sebagai tempat menyimpan daftar barang yang dipesan oleh pengguna.
<?php
namespace App\Models;
use Illuminate\Database\ELoquent\Model;
class OrderDetail extends Model
{
protected $table = 'order_detail';
protected $primaryKey = 'id';
}
Buat sebuah route dengan nama /order, route ini akan digunakan untuk menampung request pemesanan yang masuk kemudian melakukan pengolahan data dan selanjutnya menyimpan data pada tabel order dan order_detail. Pada Eloquent untuk memulai proses transaksi dengan fungsi beginTransaction(). Jika semua proses tidak memiliki masalah dan sudah selesai dalam melakukan pengolahan data, fungsi yang digunakan adalah commit(). Namun jika terjadi kesalahan dan akan mengembalikan data dalam keadaan semula menggunakan fungsi rollBack().
$app->post('/order', function (Request $request, Response $response) use ($capsule) {
$body = $request->getBody();
$json = json_decode($body, true);
$connection = $capsule->getConnection();
try {
$connection->beginTransaction();
$order = new Order();
$order->user_id = $request->getAttribute('user_id');
$order->user_address_id = $json['address_id'];
$order->status = 0;
$order->save();
$items = [];
foreach($json['item'] as $item) {
$item['order_id'] = $order->id;
$item['status'] = 0;
$items[] = $item;
}
OrderDetail::insert($items);
$connection->commit();
$message['message'] = 'Order successfully';
$statusCode = 201;
} catch (\Exception $e) {
$connection->rollBack();
$message['message'] = $e->getMessage();
$statusCode = 400;
}
$response->getBody()->write(json_encode($message));
return $response->withHeader('Content-Type', 'application-json')
->withStatus($statusCode);
})->add($authMiddleware);
Contoh json data melakukan order barang:
{
"address_id": 1,
"item": [
{
"product_id": 1,
"price": 200000,
"amount": 1,
"note": ""
},
{
"product_id": 2,
"price": 100000,
"amount": 1,
"note": "black"
},
{
"product_id": 3,
"price": 150000,
"amount": 1,
"note": ""
}
]
}
Hasil request order dengan menggunakan Postman:
Kode lengkap bisa dilihat melalui Github.
Pingback: Slim4 Tutorial: 1 Database Eloquent tanpa Laravel - PerangkatLunakKu
Pingback: Tutorial PHP Backend Slim4 - PerangkatLunakKu