Package Data | |
---|---|
Maintainer Username: | hassansin |
Maintainer Contact: | mhkr63@gmail.com (hassansin) |
Package Create Date: | 2015-12-01 |
Package Last Update: | 2018-12-24 |
Home Page: | |
Language: | PHP |
License: | MIT |
Last Refreshed: | 2025-01-28 15:11:09 |
Package Statistics | |
---|---|
Total Downloads: | 7,277 |
Monthly Downloads: | 4 |
Daily Downloads: | 0 |
Total Stars: | 25 |
Total Watchers: | 4 |
Total Forks: | 10 |
Total Open Issues: | 5 |
Shopping Cart library for Laravel 5 that uses database instead of sessions to store carts.
Edit your project's composer.json file to require hassansin/DBCart.
"require": {
"hassansin/dbcart": "dev-master"
}
Then install dependecies with composer command:
composer update
Next, add a new provider to the providers array in config/app.php:
'providers' => [
//...
Hassansin\DBCart\CartServiceProvider::class,
//...
],
Then, publish database migrations and run migration:
php artisan vendor:publish --provider="Hassansin\DBCart\CartServiceProvider" --tag=migrations
php artisan migrate
Optionally, you can publish package config file:
php artisan vendor:publish --provider="Hassansin\DBCart\CartServiceProvider" --tag=config
Now, update config/cart.php
if required
Get the current cart instance. It returns a singleton cart instance:
$cart = app('cart'); //using app() helper
or,
$cart = App::make('cart');
alternatively, you can avoid singleton instance and use the model class to load the cart instance from database everytime:
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.
$cart->addItem($attributes)
$cart->addItem([
'product_id' => 1,
'unit_price' => 10.5,
'quantity' => 1
]);
which is equivalent to $cart->items()->create($attributes)
$cart->items
Since $cart
is eloquent model instance, you can use any of the eloquent methods to get items
$items = $cart->items // by dynamic property access
$items = $cart->items()->get()
$items = $cart->items()->where('quantity', '>=', 2)->get()
$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)
$cart->removeItem($where)
$cart->removeItem([
'id' => 2
]);
which is equivalent to $cart->items()->where($where)->first()->delete()
$cart->clear()
Remove all items from the cart
$cart->clear();
$cart->checkout()
This method only updates status
and placed_at
column values. status
is set to pending
$cart->checkout();
To move all items from one cart to another cart instance:
$cart = app('cart');
$wishlist = app('cart', ['name' => 'wishlist']);
//move all wishlist items to cart
$wishlist->moveItemsTo($cart);
To move a single item between carts:
$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);
$total_price = $cart->total_price; // cart total price
$item_count = $cart->item_count; // cart items count
$date_placed = $cart->placed_at; // returns Carbon instance
Supports several cart statuses:
active
: currently adding items to the cartexpired
: cart is expired, meaningful for session cartspending
: checked out cartscompleted
: completed cartsuse 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();
By default, cart instances are named as default
. You can load other instances by providing a name:
$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:
use Hassansin\DBCart\Models\Cart;
//...
$cart = Cart::current();
$sales_cart = Cart::current('sales');
$wishlist = Cart::current('wishlist');
To get carts other than default
:
$pending_sales_carts = Cart::instance('sales')->pending()->get();
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.
Laravel Task Scheduler comes to the rescue. To enable scheduler just add following to the crontab in your server:
* * * * * 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.
Get Cart User: $cart->user
Get Item Product: $item->product
Is Cart Empty: $cart->isEmpty()
If an item exists in cart: $cart->hasItem(['id' => 10])
Expire the cart: cart->expire();
Set to completed
status: $cart->complete();
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:
Create a model by extending Hassansin\DBCart\Models\Cart
:
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;
}
}
Update cart_model
in config/cart.php
with the fully qualified class name of the extended model.
'cart_model' => App\Cart::class,
That's it, you can now load the cart as usual:
$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.