yajra / laravel-datatables

jQuery DataTables API for Laravel
https://yajrabox.com/docs/laravel-datatables
MIT License
4.74k stars 862 forks source link

How can I use an array as a data source, similar to how we use ORM models? #3167

Closed rizkyblackhat closed 3 weeks ago

rizkyblackhat commented 3 weeks ago

Summary of problem or feature request

How can I use an array as a data source, similar to how we use ORM models?

Code snippet of problem

class LicenseCartDataTable extends DataTable
{
    /**
     * Build the DataTable class.
     *
     * @param Collection $query Results from query() method.
     */
    public function dataTable(Collection $collection): CollectionDataTable
    {
        dd($collection);

        // result :
        // Illuminate\Support\Collection {#1451 // app\DataTables\LicenseCartDataTable.php:29
        //     #items: []
        //     #escapeWhenCastingToString: false
        //   }

        return DataTables::of($collection)
            ->rawColumns(['product_name', 'price', 'action'])
            ->editColumn('price', function ($cart) {
                $product    = Product::find($cart['product_id']);
                $price      = (Auth::user()->role === 'member' ? $product->sell_price : $product->base_price) * $cart['duration'];

                return $price;
            })
            ->addColumn('index', function($cart, $index) {
                return $index + 1;
            })
            ->addColumn('product_name', function ($cart) {
                $product = Product::find($cart['product_id']);

                return "
                       <div class=\"d-flex\">
                           <h5>$product->name</h5>
                           <p class=\"small\">$cart[type]</p>
                       </div>
                       ";
            })
            ->addColumn('action', function($cart) {
                $delete = route('orders.license.order.cart.delete', $cart['id']);

                return "
                       <a href=\"#\" class=\"btn btn-icon btn-danger\" onclick=\"confirmDelete('$delete')\"><i class=\"fas fa-times\"></i></a>
                       ";
            })
            ->setRowId('id');
    }

    /**
     * Get the query source of dataTable.
     */
    public function query(): Collection
    {
        $collection = collect(Session::get('cart_' . Auth::id(), []));

        dd($collection);

        // result :
        // Illuminate\Support\Collection {#1447 // app\DataTables\LicenseCartDataTable.php:75
        //     #items: array:3 [
        //       0 => array:5 [
        //         "id" => 1
        //         "type" => "new"
        //         "item_id" => null
        //         "product_id" => 11
        //         "duration" => 1
        //       ]
        //       1 => array:5 [
        //         "id" => 2
        //         "type" => "new"
        //         "item_id" => null
        //         "product_id" => 10
        //         "duration" => 1
        //       ]
        //       2 => array:5 [
        //         "id" => 3
        //         "type" => "new"
        //         "item_id" => null
        //         "product_id" => 9
        //         "duration" => 1
        //       ]
        //     ]
        //     #escapeWhenCastingToString: false
        //   }

        return $collection;
    }

System details

mrizkihidayat66 commented 3 weeks ago
class LicenseCartDataTable extends DataTable
{
    /**
     * Build the DataTable class.
     */
    public function dataTable(): CollectionDataTable
    {
        $collection = $this->query();

        return (new CollectionDataTable($collection))
               ->editColumn('price', function ($cart) {
                    $product    = Product::find($cart['product_id']);
                    $price      = (Auth::user()->role === 'member' ? $product->sell_price : $product->base_price) * $cart['duration'];

                    return $price;
                })
                ->addColumn('product_name', function ($cart) {
                    $product = Product::find($cart['product_id']);

                    return $product->name;
                })
               ->addColumn('action', function($cart) {
                    $delete = route('orders.license.order.cart.delete', $cart['id']);

                    return "
                           <a href=\"#\" class=\"btn btn-icon btn-danger\" onclick=\"confirmDelete('$delete')\"><i class=\"fas fa-times\"></i></a>
                           ";
                });
    }

    /**
     * Get the query source of dataTable.
     */
    public function query()
    {
        $collection = collect(Session::get('cart_' . Auth::id(), []));

        return $collection;
    }