2017 © Pedro Peláez
 

library dbcart

Shopping Cart library for Laravel 5 that uses Database instead of Sessions

image

hassansin/dbcart

Shopping Cart library for Laravel 5 that uses Database instead of Sessions

  • Wednesday, May 23, 2018
  • by hassansin
  • Repository
  • 3 Watchers
  • 9 Stars
  • 176 Installations
  • PHP
  • 0 Dependents
  • 0 Suggesters
  • 3 Forks
  • 2 Open issues
  • 4 Versions
  • 22 % Grown

The README.md

DBCart Build Status SensioLabsInsight codecov

Shopping Cart library for Laravel 5 that uses database instead of sessions to store carts., (*1)

Features

  • Cart for guest users
  • Cart for logged in users
  • Guest Cart is merged with User Cart when logged in
  • Singleton Cart instance to avoid unnecessary database queries. But also possible to avoid signleton cart if needed.
  • Built on top of Eloquent Model, so easily extendable and all eloquent methods can be used.
  • Multiple instances of cart
  • Schedule expired carts for deletion

Installation

  1. Edit your project's composer.json file to require hassansin/DBCart., (*2)

    "require": {
        "hassansin/dbcart": "dev-master"
    }
    
  2. Then install dependecies with composer command:, (*3)

    composer update
  3. Next, add a new provider to the providers array in config/app.php:, (*4)

    'providers' => [
        //...
        Hassansin\DBCart\CartServiceProvider::class,
        //...
    ],
    
  4. Then, publish database migrations and run migration:, (*5)

    php artisan vendor:publish --provider="Hassansin\DBCart\CartServiceProvider" --tag=migrations
    php artisan migrate
    

Configuration

Optionally, you can publish package config file:, (*6)

php artisan vendor:publish --provider="Hassansin\DBCart\CartServiceProvider" --tag=config

Now, update config/cart.php if required, (*7)

Usage

Get Cart Instance:

Get the current cart instance. It returns a singleton cart instance:, (*8)

$cart = app('cart'); //using app() helper

or,, (*9)

$cart = App::make('cart');

alternatively, you can avoid singleton instance and use the model class to load the cart instance from database everytime:, (*10)

use Hassansin\DBCart\Models\Cart;
//...
$cart = Cart::current();

The idea of using singleton cart is that the cart object will be available globally throughout your app (e.g. controllers/models/views/view composers etc) for a single request. Also as you manipulate cart items, $cart->item_count and $cart->total_price would get updated., (*11)

Add an Item: $cart->addItem($attributes)

$cart->addItem([
    'product_id' => 1,
    'unit_price' => 10.5,
    'quantity' => 1
]); 

which is equivalent to $cart->items()->create($attributes), (*12)

Get Items: $cart->items

Since $cart is eloquent model instance, you can use any of the eloquent methods to get items, (*13)

$items = $cart->items // by dynamic property access
$items = $cart->items()->get()  
$items = $cart->items()->where('quantity', '>=', 2)->get()

Update an Item: $cart->updateItem($where, $attributes)

$cart->updateItem([
    'id' => 2
], [
    'product_id' => 1,
    'unit_price' => 10.5,
    'quantity' => 1
]); 

which is equivalent to $cart->items()->where($where)->first()->update($attributes), (*14)

Remove an Item: $cart->removeItem($where)

$cart->removeItem([
    'id' => 2
]); 

which is equivalent to $cart->items()->where($where)->first()->delete(), (*15)

Clear Cart Items: $cart->clear()

Remove all items from the cart, (*16)

$cart->clear(); 

Checkout cart: $cart->checkout()

This method only updates status and placed_at column values. status is set to pending, (*17)

$cart->checkout();

Move item(s) between carts:

To move all items from one cart to another cart instance:, (*18)

$cart = app('cart');
$wishlist = app('cart', ['name' => 'wishlist']);

//move all wishlist items to cart
$wishlist->moveItemsTo($cart);

To move a single item between carts:, (*19)

$cart = app('cart');
$wishlist = app('cart', ['name' => 'wishlist']);

//move an wishlist item to cart
$item = $wishlist->items()->where(['product_id' => 1])->first();
$item->moveTo($cart);

Get Cart Attributes

$total_price = $cart->total_price; // cart total price
$item_count = $cart->item_count; // cart items count
$date_placed = $cart->placed_at; // returns Carbon instance

Cart Statuses

Supports several cart statuses: * active: currently adding items to the cart * expired: cart is expired, meaningful for session carts * pending: checked out carts * completed: completed carts, (*20)

use Hassansin\DBCart\Models\Cart;

// get carts based on their status: active/expired/pending/complete
$active_carts = Cart::active()->get();
$expired_carts = Cart::expired()->get();
$pending_carts = Cart::pending()->get();
$completed_carts = Cart::completed()->get();

Working with Multiple Cart Instances

By default, cart instances are named as default. You can load other instances by providing a name:, (*21)

$cart = app('cart'); // default cart, same as: app('cart', [ 'name' => 'default'];
$sales_cart = app('cart', [ 'name' => 'sales']);
$wishlist = app('cart', [ 'name' => 'wishlist']);

or, without singleton carts:, (*22)

use Hassansin\DBCart\Models\Cart;
//...
$cart = Cart::current();
$sales_cart =  Cart::current('sales');
$wishlist =  Cart::current('wishlist');

To get carts other than default:, (*23)

$pending_sales_carts = Cart::instance('sales')->pending()->get();

Delete Expired Carts:

The guest carts depend on the session lifetime. They are valid as long as the session is not expired. You can increase session lifetime in config/session.php to increase cart lifetime. When a session expires, a new cart instance will be created in database and the old one will no longer be used. Over time, these expired carts could pile-up in database., (*24)

Laravel Task Scheduler comes to the rescue. To enable scheduler just add following to the crontab in your server:, (*25)

* * * * * php /path/to/artisan schedule:run >> /dev/null 2>&1 

That's it. The module will now check for expired carts in every hour and delete them. This won't affect the carts for loggedin users., (*26)

Other features:

Get Cart User: $cart->user, (*27)

Get Item Product: $item->product, (*28)

Is Cart Empty: $cart->isEmpty(), (*29)

If an item exists in cart: $cart->hasItem(['id' => 10]), (*30)

Expire the cart: cart->expire();, (*31)

Set to completed status: $cart->complete();, (*32)

Extending Cart Model

It's easy to extend DBCart. You can extend base DBCart model and add your own methods or columns. Follow these steps to extend the cart model:, (*33)

  1. Create a model by extending Hassansin\DBCart\Models\Cart:, (*34)

    namespace App;
    
    use Hassansin\DBCart\Models\Cart as BaseCart;
    
    class Cart extends BaseCart
    {
        //override or add your methods here ...
    
        public function getSubTotalAttribute(){
            return $this->attributes['total_price'];
        }
        public function getGrandTotalAttribute(){
            //taking discount, tax etc. into account            
            return $this->sub_total - $this->discount;
        }
    
    }
    
  2. Update cart_model in config/cart.php with the fully qualified class name of the extended model., (*35)

    'cart_model' => App\Cart::class,
    
  3. That's it, you can now load the cart as usual:, (*36)

    $cart = App::make('cart');
    

You can also follow the above steps and create your own CartLine model by extending Hassansin\DBCart\Models\CartLine. Be sure to update config/cart.php to reflect your changes., (*37)

The Versions

23/05 2018

dev-master

9999999-dev https://github.com/hassansin/dbcart

Shopping Cart library for Laravel 5 that uses Database instead of Sessions

  Sources   Download

MIT

The Requires

 

The Development Requires

by Avatar hassansin

database laravel ecommerce cart laravel5 shopping-cart

23/05 2018

dev-dev-patch-1

dev-dev-patch-1 https://github.com/hassansin/dbcart

Shopping Cart library for Laravel 5 that uses Database instead of Sessions

  Sources   Download

MIT

The Requires

 

The Development Requires

by Avatar hassansin

database laravel ecommerce cart laravel5 shopping-cart

23/05 2018

dev-hassansin-patch-1

dev-hassansin-patch-1 https://github.com/hassansin/dbcart

Shopping Cart library for Laravel 5 that uses Database instead of Sessions

  Sources   Download

MIT

The Requires

 

The Development Requires

by Avatar hassansin

database laravel ecommerce cart laravel5 shopping-cart

12/12 2015

dev-dev

dev-dev https://github.com/hassansin/dbcart

Shopping Cart library for Laravel 5 that uses Database instead of Sessions

  Sources   Download

MIT

The Requires

 

The Development Requires

by Avatar hassansin

database laravel ecommerce cart laravel5 shopping-cart