whitecube / laravel-prices
管理您Laravel应用中产品和服务的购买、销售和租赁价格
Requires
- illuminate/support: ^8.0|^9.0|^10.0|^11.0
- whitecube/php-prices: ^3.0|^4.0
Requires (Dev)
- orchestra/testbench: ^6.24|^7.0|^8.0
- pestphp/pest: ^1.21
README
管理您Laravel应用中产品和服务的购买、销售和租赁价格
安装
composer require whitecube/laravel-prices
配置
您可以通过运行此命令来发布配置文件:
php artisan vendor:publish --tag=prices-config
一旦在 config/prices.php
中创建了您的配置文件,您可以通过更改来将价格模型编辑为自定义价格模型:
return [ 'model' => \App\Models\CustomPriceModel::class, ];
快速概述
此包允许您将价格附加到任何您想要的内容,并随着时间的推移保留价格变更的历史记录。
为此,包将迁移一个 prices
表,该表用于存储在您可定价项目中发生的每个价格变更(例如产品或服务)。当您访问项目价格时,该表中最新结果将被返回。
此文档将使用一个假的 Product
模型作为示例,但您可以将这些价格链接到任何您想要的内容。
用法
将 HasPrices
特性添加到您的产品模型中。
<?php use Whitecube\LaravelPrices\HasPrices; class Product extends Model { use HasPrices; }
这将为该模型解锁此包的所有功能。以下是您可以现在执行的操作
设置价格
$product->price = new Price(amount: 50, currency: 'EUR');
您可以通过传递附加参数来设置价格,例如类型(默认为销售,稍后会有更多介绍)以及价格生效的时间点。
use Whitecube\LaravelPrices\Models\Price; $product->price = new Price( amount: 50, currency: 'EUR', type: 'selling', activated_at: now()->addWeek() );
或者如果您想避免使用 use
语句
$product->setPrice( amount: 50, currency: 'EUR', type: 'selling', activated_at: now()->addWeek() );
请注意,此包在内部使用 whitecube/php-prices
。这使得您可以在以后进行准确的计算,而不会遇到浮点数精度问题。
这意味着它在存储到数据库之前将价格转换为“小单位”(即分)。您在创建新价格时指定的值可以是主要单位或小单位。要直接在次要单位中定义价格,请使用 minor
参数而不是 amount
$product->price = new Price( minor: 5000, currency: 'EUR', type: 'selling', activated_at: now()->addWeek() );
获取当前销售价格
最快速和最简单的方法是获取一个 Whitecube\Price\Price
实例,以便您可以使用它进行准确计算。
$price = $product->price;
默认情况下,这将返回具有 selling
类型的最新价格,但您可以通过覆盖您类上的 getDefaultPriceType
方法来更改此行为。它必须返回一个字符串,该字符串与您为该可定价项目类希望默认使用的价格类型相对应。
手动访问关系
上述示例通过特征上的访问器方法进行了一些魔法,使得最常见的用法更容易,但在幕后它只是一个关系查询。当需要时(并在 current()
范围的帮助下),您可以自己查询此关系(它将只返回当前活动的价格)。
$buying_price = $product->prices()->current()->where('type', 'buying')->first();
请注意,这返回的是 Whitecube\LaravelPrices\Models\Price
模型的一个实例,而不是一个 Whitecube\Price\Price
实例。要手动访问它,请调用:
$buying_price->toObject();
如何处理一次性价格
使用此包与价格配合使用的主要方式是将其用作特定项目所有价格的按时间顺序的历史记录表。这意味着您应该在创建价格时定义 activated_at
属性,以便系统可以准确地判断在您查询时是否应考虑该价格。
然而,有时您可能需要为某个项目指定一个特殊的单次价格,而无需每次自动应用。这可以通过省略或设置 activated_at
属性为空来实现,并将价格的ID存储在您需要引用的地方。这样做时,这些价格在使用基于时间的范围(如 current()
或 effectiveAt()
)时将不会返回。
可用范围
current()
过滤查询,仅返回当前价格模型。
$product->prices()->current()->first();
effectiveAt($date)
过滤查询,仅返回在指定时间活跃的价格模型(接受Carbon实例)
$product->prices()->effectiveAt(now()->subWeek())->first();
oneOffs()
过滤查询,仅返回单次价格(activated_at === null
)
$product->prices()->oneOffs()->get();
🔥 赞助商
如果您在生产应用程序中依赖此包,请考虑赞助我们!这是帮助我们继续做自己喜欢做的事情:制作出色的开源软件的最好方式。
贡献
请随时提出更改建议,请求新功能或自己修复错误。我们相信还有很多可以改进的地方,我们非常乐意合并有用的pull请求。
谢谢!
用❤️为开源制作
在 Whitecube,我们每天都在日常工作中使用大量的开源软件。因此,当我们有机会回馈时,我们非常兴奋!
我们希望您会喜欢我们的小小贡献,如果您在项目中发现它有用,我们非常乐意听到您的反馈。在 Twitter 上关注我们,获取更多更新!