11# 🛒 Laravel Extendable Basket
22
3- [ ![ Build Status] ( https://travis-ci.com/Jord-JD/laravel-extendable-basket.svg?branch=master )] ( https://travis-ci.com/Jord-JD/laravel-extendable-basket )
4- [ ![ Coverage Status] ( https://coveralls.io/repos/github/Jord-JD/laravel-extendable-basket/badge.svg?branch=master )] ( https://coveralls.io/github/Jord-JD/laravel-extendable-basket?branch=master )
3+ [ ![ Tests] ( https://github.com/Jord-JD/laravel-extendable-basket/actions/workflows/tests.yml/badge.svg )] ( https://github.com/Jord-JD/laravel-extendable-basket/actions/workflows/tests.yml )
54[ ![ ] ( https://img.shields.io/packagist/dt/jord-jd/laravel-extendable-basket.svg )] ( https://packagist.org/packages/jord-jd/laravel-extendable-basket/stats )
65
76Laravel Extendable Basket provides several abstract classes that implement basic ecommerce basket functionality.
@@ -17,7 +16,9 @@ composer require jord-jd/laravel-extendable-basket
1716
1817## Compatibility
1918
20- This package supports Laravel versions 5.5 through 10 and requires PHP 8.1 or higher.
19+ This package supports Laravel 5.5 through 13. Its own runtime syntax supports PHP
20+ 7.1 and later; Composer will also enforce the higher PHP minimum required by the
21+ Laravel version selected by your application.
2122
2223## Setup
2324
@@ -45,6 +46,7 @@ Create a Basket model.
4546<?php
4647namespace App;
4748
49+ use Illuminate\Database\Eloquent\Relations\HasMany;
4850use JordJD\LaravelExtendableBasket\Models\Basket as BasketModel;
4951
5052class Basket extends BasketModel
@@ -64,6 +66,7 @@ Create a BasketItem model.
6466<?php
6567namespace App;
6668
69+ use Illuminate\Database\Eloquent\Relations\BelongsTo;
6770use JordJD\LaravelExtendableBasket\Models\BasketItem as BasketItemModel;
6871
6972class BasketItem extends BasketItemModel
@@ -92,7 +95,8 @@ namespace App;
9295use Illuminate\Database\Eloquent\Model;
9396use JordJD\LaravelExtendableBasket\Interfaces\Basketable;
9497
95- class Product extends Model implements Basketable {
98+ class Product extends Model implements Basketable
99+ {
96100
97101 // ...
98102
@@ -139,7 +143,7 @@ with any Eloquent model.
139143
140144``` php
141145// Get new basket
142- $basket = new Basket();
146+ $basket = new Basket(); // Saved automatically when its first item is added.
143147
144148// Get current basket
145149$userBasketId = Auth::user()->basket_id;
@@ -156,12 +160,18 @@ used to store information about variations on a product.
156160
157161``` php
158162$quantity = 5;
159- $product = Product::FindOrFail (1);
163+ $product = Product::findOrFail (1);
160164
161- $basket->add($quantity, $product);
162- $basket->add($quantity, $product, ['colour' => 'red', 'size' => 'medium']);
165+ $item = $ basket->add($quantity, $product);
166+ $variantItem = $ basket->add($quantity, $product, ['colour' => 'red', 'size' => 'medium']);
163167```
164168
169+ ` add() ` returns the created basket item. If the same model and identical metadata
170+ already exist in the basket, its quantity is increased and that existing item is
171+ returned. Laravel morph-map aliases are stored when the basketable model provides
172+ one. Basketable models must be saved before they are added; otherwise an
173+ ` InvalidArgumentException ` is thrown instead of creating an orphaned item.
174+
165175### Getting basket items
166176
167177Getting items from the basket and the basketable model they contain can be easily
@@ -194,6 +204,13 @@ $item = $basket->items->first();
194204$item->delete();
195205```
196206
207+ To remove every item in one query, call ` clear() ` . It returns the number of rows
208+ deleted and keeps the basket itself available for reuse.
209+
210+ ``` php
211+ $deletedItemCount = $basket->clear();
212+ ```
213+
197214## Getting the unit cost of a basket item
198215
199216Getting the unit cost of a basket item just involves calling the ` getPrice ` method of
@@ -230,7 +247,7 @@ A `getSubtotal` method is provided in the basket class that provides the total o
230247items in the basket. See the following example.
231248
232249``` php
233- $subtotal = $basket->getSubtotal()
250+ $subtotal = $basket->getSubtotal();
234251```
235252
236253If you wish to add delivery costs or discounts, you can create a new ` getTotal ` method
0 commit comments