【问题标题】:How to properly store the price as integer in DB?如何将价格正确存储为数据库中的整数?
【发布时间】:2019-01-22 19:51:55
【问题描述】:

我的字段价格如下:

<div>
    <label for="price">Price</label>
    <input type="hidden" name="price" id="price"/>
    <input type="number"
           onkeydown="javascript: return event.keyCode == 69 ? false : true"
           min="0" step="any"
           class="form-control"
           value="{{ old('price') }}"
           name="price" id="price" placeholder="Price (Ex: 10,00)"/>
</div>

如果用户引入例如“10.15”,则 $request->all() 会显示此字段,如下所示:

  "price" => "10.15"

但在数据库中,价格存储为 10。我将价格列为整数。然后我还有一个页面可以编辑价格,表单字段中的价格显示为“10”,但应该是“10.15”。

您知道如何将值“10.15”存储在数据库中并在编辑页面中显示正确的值“10.15”吗?

在控制器中,价格存储在数据库中,例如:

'price' => $request->price,

【问题讨论】:

  • 10.15 不是整数,可以将列类型改为decimal
  • 但是在数据库中存储为整数而不是十进制不是更好吗?
  • 不,不是。使用 decimal 创建它的目的。
  • 价格列为十进制的也存储“10”在数据库中。
  • 因为看起来您为price 索引传递了一个字符串。投射到其他东西上,比如浮动。

标签: php laravel


【解决方案1】:

更新:尽管似乎有一些人不喜欢它,但快速的谷歌搜索表明钱应该以最小的单位存储。在美元的情况下,这意味着便士。无论如何,堆栈不会让我删除已接受的答案。

如果您的 ORM 扩展了 elequent 模型,那么您应该在模型中使用 getPriceAttribute() 和 setPriceAttribute($val)。另外,我不同意另一个答案。我会将价格存储为基于便士的整数,然后使用 getter 和 setter 生成小数。 (仅供参考:像条纹这样的现代商务解决方案使用便士整数而不是小数)

Product extends Model{
    public function getPriceAttribute(){
        return $this->attributes['price'] /100;
    }
    public function setPriceAttribute($val){
        $this->attributes['price'] = $val * 100;
    }
}

用法:

$myProduct->price = 69.69;
echo $myProduct->price;

【讨论】:

  • 谢谢,插入数据库使用 Ticket::create(['price'] => $request->ticke_price ])。还有其他字段,但价格是这样存储的。您是说在 Ticket 模型中创建 2 种方法,然后使用 Ticket::create(['price'] => setPrice($request->ticke_price )])。 ?
  • 我不确定模型的 $fillables 是否通过设置器。有些东西告诉我他们没有。您可能需要使用 $ticket->price = xx.xx 设置价格
  • 所以不可能像 "Ticket::create([ 'name' => $request->ticket_name, ... 'price' => setPrice($request- >registration_type_price), 'c_id' => $c->id ]); $c->save();"?
  • 是否需要先创建带有姓名等其他字段的票,然后设置价格?
  • 使用除价格以外的所有可填充项创建票证,然后使用 $myNewTicket->price = 12.34 和 save()。您的数据库应显示 1234 整数。当您尝试访问属性时,laravel 会自动调用 getPriceAttribute() 和 setPriceAttribute。
【解决方案2】:

货币值应存储在数据库中的十进制字段中,而不是整数。

【讨论】:

  • 谢谢,但 db 列是十进制的,它也存储为“10”而不是“10.15”。
  • 最好将货币值存储为尽可能小的整数。例如,美元应存储为以便士为单位的整数值。浮点数不准确。 stackoverflow.com/a/225592/9836025
  • 谢谢,但你知道在数据库中存储为整数 10.15 而不是 10?
  • @John 这里的每个人都在告诉您将数字存储为小数,而您坚持使用整数。当你来寻求帮助时,要敞开心扉接受正确的答案,而不是你想听的答案。在迁移时创建十进制字段时,必须指定位数:$table-&gt;decimal('value', 12, 2)(12 位,即 2 位小数和 10 位整数)
【解决方案3】:

您的数据类型应该是 Float 或 double 或任何有小数点的小数点,整数(通常称为 int)是没有小数点的数字。 float 是一个浮点数。

因此,在您的 mysql 数据类型、Javascript 和 任何语言 中,您使用它不应该是 int,否则它会被四舍五入。

尝试将您的表格更改为浮动并重新插入另一个浮点数(已经插入的数字不会受到影响,因为它们已经四舍五入)您会看到它现在将其存储为浮点数观点。

但正如乔纳森所说,永远不要将货币存储为浮点数,而是将其存储为尽可能小的尺寸,并在每次需要将小数点放在适当位置时重新计算。

【讨论】:

    猜你喜欢
    • 2021-09-30
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多