gpt4 book ai didi

php - 整个产品属于折扣品类吗?

转载 作者:行者123 更新时间:2023-12-04 04:17:58 25 4
gpt4 key购买 nike

我有这些表:

products
-- name
-- price
-- quantity
-- category_id

discounts
-- type('percentage','numeric')
-- value
-- expired_at

categories
-- name

discountables
-- discount_id
-- discountable_id
-- discountable_type

discountables 中有很多关系:
discounts and categories discounts and products
我已经完成了如何在 discounts and products 之间打折

现在我很困惑如何打折属于我添加到 discountables 的类别的整个产品

关系:

类别模型
public function discounts()
{
return $this->morphToMany('App\Models\Discount', 'discountable');
}

产品型号
public function discounts()
{
return $this->morphToMany('App\Models\Discount', 'discountable');
}

折扣模式:
public function categories()
{
return $this->morphedByMany('App\Models\Category', 'discountable')->withTimestamps();
}

public function products()
{
return $this->morphedByMany('App\Models\Product', 'discountable')->withTimestamps();
}

直接给产品打折的我的代码 discounts and products
  /**
* get price of product after discount
*
* @return void
*/
public function getDiscountProductAttribute() {
foreach ($this->discounts as $discount) {
if($discount->expired_at > Carbon::now()){
if ($discount->type == 'numeric'){
return $this->price - $discount->value;
}else{
return $this->price - ($this->price * ($discount->value / 100));
}
}
}
}

所以我需要如何打折属于我添加到 discountables 的类别的整个产品?

最佳答案

你们的关系很好。我只是重新设计了一下来解决这个问题。

class Discount extends Model
{
/**
* Check whether this discount is expired.
*
* return bool
*/
public function expired()
{
// I assume that expired_at is also a Carbon instance.
return $this->expired_at->isPast();
}

/**
* Return the discount amount for each product.
*
* @return double
*/
public function apply(Product $product)
{
if ($this->type === 'numeric') {
$this->value;
}

if ($this->type === 'percentage') {
return $product->price * ($this->value / 100);
}

return 0;
}
}
class Product extends Model
{
public function allDiscounts()
{
return $this->discounts
->merge($this->category->discounts)
->unique();
}

pubic function getTotalDiscountAttribute()
{
return $this->allDiscounts()
->reject
->expired()
->map
->apply($this)
->sum();
}

public function getTotalPriceAttribute()
{
return $this->price - $this->total_discount;
}
}
因此,您可以在应用其自身及其类别(如果有)的各种折扣后,通过简单地说:
$product->total_price;
我希望这有帮助。如果它在任何步骤失败,请告诉我。
顺便一提。你的问题让我想起了几年前的 pretty good speech。它是关于使用继承和空对象模式解决一些类似的问题。它太酷了。您不需要以这种方式重写它,但它是一个非常好的设计。

关于php - 整个产品属于折扣品类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60155813/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com