2016-02-03 2 views
0

У меня большие трудности с чем-то очень простым, и после того, как я попытался найти ответ в течение двух дней, мне нужна помощь.PHP, работающий с валютами и единицами

В моей базе данных по продуктам, я работает с валютами. Я хотел бы сохранить все цены на товары в центах. Все отлично до этого момента, так как я также работаю с подразделениями. Мои продукты состоят из бакалейных товаров. Так, к примеру, у меня есть следующие продукты, которые я могу выбрать из:

- Bottle of Coca Cola 
- Can of Beer 
- Pack of Milk 
.. and so on 

Единиц вышеуказанных продуктов, как правило, в количестве, вы можете получить 1 бутылка кокса, или два, и так далее.

Рядом с этим есть продукты, такие как курица или стейк. Они измеряются в унциях, фунтах, камнях и т. Д. Я хотел бы сохранить цену 1 грамм для каждого продукта.

Теперь, я могу добавить в нашу базу данных units и просто для каждого продукта добавить блок. Например, для бутылок кокса я могу добавить блок под названием bottle или просто piece. А для курицы, стейка я мог бы сказать gram. Или я могу использовать числовые значения, а для бутылки я просто использую 1 и для грамма, вероятно 1000 на один килограмм, или 500 фунтов.

Затем, чтобы выполнить некоторые вычисления, я мог бы просто сделать это, для каждого продукта, при отображении данных:

$total_price = $product->price * product->unit * product->amount/100 

Сумма означает введенную сумму, например, я хочу две бутылки кокса , Я ввожу 2 за сумму. Или, я хочу 700 граммов курицы, я просто вхожу в 700. Кажется, это работает. Но мне это просто не кажется правильным, похоже, должен быть лучший способ сделать это.

Другая проблема заключается в отображении всех цен на каждый продукт. Я, конечно, не хочу отображать их в центах, а скорее в евро, поэтому я просто делю price per piece на 100 и затем показываю эту цену. Так, например, одна бутылка кокса стоит 2 евро, тогда в моей базе price поле для бутылки кокса - 200 (cents), а при получении цены и ее отображении я делю его на 100, чтобы отобразить 2 евро.

Но для курицы, стейка и так далее я не могу этого сделать. Я бы, например, сначала должен был рассчитать цену от 1 грамма до 1000 грамм, а затем снова разделить эту цену на 100, чтобы отобразить правильные евро.

Итак, с радостью, кто-то понимает мою проблему здесь, и любые указатели в правильном направлении, чтобы помочь мне найти мой ответ, будем очень благодарны.

+0

Похоже, вы ищете улучшения кода. Возможно, вас интересует наш сайт Code Review: http: //codereview.stackexchange.com/ – Litty

ответ

1

Не уверен, что я понимаю вашу логику здесь, но похоже, что вы могли бы получить много из этого, используя хорошо продуманное объектно-ориентированное программирование (ООП). Начните с базы Product - и расширьте это с помощью WeightedProduct и PackagedProduct. Затем выполните свою общую логику внутри Product и вашу конкретную логику в каждом из соответствующих расширяющих классов (WeightedProduct и PackagedProduct).

class Product { 
    public function __construct() {} 
} 

class WeightedProduct extends Product { 
    $unit = 'piece'; 
    public function __construct() { 
     parent::__construct(); 
    } 
    protected function getTotal() { 
     // return the total based on WeightedProducts 
    } 
} 

class PackagedProduct extends Product { 
    $unit = 'gram'; 
    public function __construct() { 
     parent::__construct(); 
    } 
    protected function getTotal() { 
     // return the total based on PackagedProducts 
    } 
} 
+0

Я вижу, где вы собираетесь здесь, я использую laravel, поэтому на самом деле это может быть чем-то, о чем можно подумать, поскольку это, вероятно, не так просто, как я себе представляю :) – Hardist

+0

Это на самом деле очень просто - Класс продукта расширил «Illuminate \ Database \ Eloquent \ Model» - тогда вы получите всю доброжелательность, а также свои собственные реализации вашей конкретной бизнес-логики. – swatkins

+0

Да, я хорошо знаю об этом :) Просто нужно подтолкнуть в правильном направлении, и на самом деле теперь, когда я думаю об этом, возможно, я могу использовать getPriceAttriute для чего-то. – Hardist