Mengambil data lain yang terkait dengan Fractal di Laravel

Di Fractal ada cara untuk mengambil data lain dengan istilah “includes”. Pertama yang mesti didefinisikan itu adalah “data lain yang terkait” seperti apa yang dimaksud? Untuk data yang terkait ini mesti saya coba contohkan dulu sederhananya ya.

Contoh kasus adalah data keranjang belanja. Dalam keranjang belanja kadang developer membuat struktur table seperti ini.

Carts
– ID
– CustomerID
– Note
– Total
– TotalItem
– dll

lalu ada tabel CartDetails yang isinya:

CartDetails:
– ID
– CartID
– ProductID
– ProductName
– QTY
– Subtotal

Kasusnya, munculkan data keranjang belanja berdasarkan CustomerID yang berhasil login.

Data keranjang ini terlibat dalam 2 tabel. Dan biasanya proses pengambilan data ini juga mesti 2 query walaupun memang bisa dalam 1 query. Anggap aja kasus ini 2 query ya đŸ™‚

Setelah kita berhasil query data keranjang. kita mesti buat layout format Fractal, yang biasa disebut dalam istilah Fractalnya adalah “transform”. Dalam transform inilah data hasil query kita simpan dalam object PHP yang akan dikirimkan response nya di API.

Ngeliat documentasi Fractal khusus untuk laravel, banyak tutorial yamg 1 query harus disimpan dalam 1 transform. Nah untuk kasus keranjang ini, kita kan ada 2 query, jadi ya mesti ada 2 transform tapi pemanggilan transform nya tetep 1 kali.

Berikut adalah kode dibagian controller-nya:

class CartController extends Controller
{
    public function get(Request $request) {
        $customer_id = $request->customer_id;
        $CartRepository = new CartRepository;
        $data = $CartRepository->getByCustomer($customer_id);

        $cart = new \stdClass();

        if(count($data) > 0) {
            $cart->id = $data->id;
            $cart->customer_id = $data->customer_id;
            $cart->note = $data->note;
            $cart->total = $data->total;
            $cart->total_qty = $data->total_qty;

            $cart_detail = $CartRepository->getDetailCart($data->id);

            if( count($cart_detail) > 0 ) {
                $cart->items = $cart_detail;
                return fractal()
                    ->item($cart)
                    ->transformWith(new CartTransformer)
                    ->toArray();

            } else {
                return Response::json([
                    'error' => [
                        'message' => 'Cart Empty!'
                    ]
                ], 404);
            }

        } else {
            return Response::json([
                'error' => [
                    'message' => 'Cart Empty!'
                ]
            ], 404);
        }
    }

... # potongan kode

Pada kode diatas, saya ambil data cart, lalu saya simpan diobject sementara dan saya ambil cart_detail untuk mengambil detail-detail dari cart, baru setelah itu saya panggil transformnya.

return fractal()
  ->item($cart)
  ->transformWith(new CartTransformer)
  ->toArray();

Bagian kode CartTransformer.php:

<?php

namespace App\Transformers;

use League\Fractal\TransformerAbstract;

use App\Transformers\CartItemTransformer;

class CartTransformer extends TransformerAbstract
{
  protected $defaultIncludes = [
        'items'
    ];

  public function transform($data) {
    return [
      'id' => $data->id,
      'customer_id' => $data->customer_id,
      'note' => $data->note,
      'total' => $data->total,
      'total_qty' => $data->total_qty
    ];
  }

  public function includeItems($data)
    {
    	$items = $data->items;
        return $this->collection($items, new CartItemTransformer);
    }
}

Di kode ini, saya include CartItemTransformer. Nah beginilah cara menampilkan transformer / data terkait pada Fractal. Anda cukup menambahkan defaultIncludes dan menyiapkan fungsi includesItems-nya.

Alhasil, jika kita panggil api cart ini, data cart serta data cart item otomatis ke ambil. Berikut contoh yang saya buat.

Referensi:

# http://fractal.thephpleague.com/

# https://github.com/spatie/laravel-fractal

Leave a Reply

Your email address will not be published. Required fields are marked *