hassansin/dbcart

Laravel 5 的购物车库,使用数据库而非会话存储购物车

v1.0.0 2018-12-24 13:00 UTC

This package is auto-updated.

Last update: 2024-09-05 22:24:27 UTC


README

Laravel 5 的购物车库,使用数据库而非会话存储购物车。

功能

  • 访客用户购物车
  • 登录用户购物车
  • 访客购物车在登录时与用户购物车合并
  • 单例购物车实例以避免不必要的数据库查询。但也可以根据需要避免单例购物车。
  • 基于 Eloquent 模型构建,易于扩展,可以使用所有 eloquent 方法。
  • 多个购物车实例
  • 安排过期的购物车进行删除

安装

  1. 编辑您的项目 composer.json 文件,添加 hassansin/DBCart。

    "require": {
        "hassansin/dbcart": "dev-master"
    }
  2. 然后使用 composer 命令安装依赖项

     composer update
    
  3. 接下来,向 config/app.php 中的 providers 数组添加一个新的提供者

    'providers' => [
        //...
        Hassansin\DBCart\CartServiceProvider::class,
        //...
    ],
  4. 然后,发布数据库迁移并运行迁移

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

配置

可选,您可以发布包配置文件

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

现在,如果需要,请更新 config/cart.php

用法

获取购物车实例

获取当前购物车实例。它返回一个单例购物车实例

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

或者,

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

另外,您可以避免单例实例,并使用模型类在每次从数据库中加载购物车实例

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

使用单例购物车的想法是购物车对象将在您的应用程序的全局范围内(例如控制器、模型、视图、视图组合器等)在整个请求中可用。同时,当您操作购物车项目时,$cart->item_count$cart->total_price 也会更新。

添加项目: $cart->addItem($attributes)

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

等同于 $cart->items()->create($attributes)

获取项目: $cart->items

由于 $cart 是 eloquent 模型实例,您可以使用任何 eloquent 方法来获取项目

$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
]); 

等同于 $cart->items()->where($where)->first()->update($attributes)

删除项目: $cart->removeItem($where)

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

等同于 $cart->items()->where($where)->first()->delete()

清除购物车项目: $cart->clear()

从购物车中删除所有项目

$cart->clear(); 

结账购物车: $cart->checkout()

此方法仅更新 statusplaced_at 列值。 status 设置为 pending

$cart->checkout();

在购物车之间移动项目

将一个购物车中的所有项目移动到另一个购物车实例

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

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

将单个项目在购物车之间移动

$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

购物车状态

支持多个购物车状态

  • active: 正在向购物车添加项目
  • expired: 购物车已过期,对会话购物车有意义
  • pending: 结账的购物车
  • completed: 完成的购物车
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();

与多个购物车实例一起工作

默认情况下,购物车实例的名称为 default。您可以通过提供名称来加载其他实例

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

或者,没有单例购物车

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

要获取除 default 之外的购物车

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

删除过期的购物车

访客购物车依赖于会话生命周期。只要会话未过期,它们就有效。您可以在 config/session.php 中增加会话生命周期来增加购物车生命周期。当会话过期时,将在数据库中创建一个新的购物车实例,旧的将不再使用。随着时间的推移,这些过期的购物车可能会在数据库中累积。

Laravel任务调度器可以解决这个问题。要启用调度器,只需将以下内容添加到您服务器上的 crontab 中

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

这就完成了。该模块现在将每小时检查一次过期的购物车并将它们删除。这不会影响登录用户的购物车。

其他功能

获取购物车用户: $cart->user

获取商品项: $item->product

购物车是否为空: $cart->isEmpty()

如果购物车中存在商品项: $cart->hasItem(['id' => 10])

使购物车过期: cart->expire();

设置为 completed 状态: $cart->complete();

扩展购物车模型

扩展 DBCart 很容易。您可以通过添加自己的方法或列来扩展基础 DBCart 模型。按照以下步骤扩展购物车模型

  1. 通过扩展 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;
        }
        
    }
  2. cart_modelconfig/cart.php 中更新为扩展模型的完全限定类名。

    'cart_model' => App\Cart::class,
  3. 这就完成了,您现在可以像平常一样加载购物车

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

您也可以按照上述步骤,通过扩展 Hassansin\DBCart\Models\CartLine 创建自己的 CartLine 模型。请确保更新 config/cart.php 以反映您的更改。