Логическая колонка в MySQL - как? - PullRequest
1 голос
/ 08 июля 2010

У меня есть модель данных, скажем: invoices (m:n) invoice_items и в настоящее время я храню итоговую сумму счета, рассчитанную в PHP на сумму invoice_items, в столбце invoices Мне не нравится хранить производные данные, так как это позже открывает путь для ошибок.

Как создать логический столбец в таблице invoices в MySql? Это то, что я бы лучше обрабатывать в PHP (в данном случае CakePHP)?

Ответы [ 4 ]

3 голосов
/ 09 июля 2010

В CakePHP есть нечто, называемое виртуальными полями, которое позволяет вам достичь того же результата в вашей модели, а не полагаться на поддержку MySQL.Виртуальные поля позволяют вам «смешивать» различные данные в вашей модели и предоставлять их в качестве дополнительного столбца в вашей записи.Это чище, чем другие подходы здесь ... (без взлома afterFind ()).

Подробнее здесь: http://book.cakephp.org/view/1608/Virtual-fields

2 голосов
/ 08 июля 2010

Leo,

Одна вещь, которую вы можете сделать, это изменить метод afterFind () в вашей модели.Это будет пересчитывать итоговую сумму в любое время, когда вы получите счет (стоимость обработки во время выполнения), но будет означать, что вы не сохраняете его в таблице счетов, что, по-видимому, и следует избегать (исправьте, если я ошибаюсь).

Попробуйте это:

class Invoice extends AppModel {
// .. other stuff
 function afterFind() {
  parent::afterFind();
  $total = 0;
  foreach( $this->data['Invoice']['InvoiceItems'] as $item )
   $total += ($item['cost'] * $item['quantity']);

  $this->data['Invoice']['total'] = $total;
 }
}

Возможно, я испортил массивы в отношении hasMany (линия foreach), но я надеюсь, что вы получите суть.HTH,

Travis

1 голос
/ 08 июля 2010

http://forge.mysql.com/wiki/MySQL_virtual_columns_preview

Это еще не реализовано, но должно быть реализовано в MySQL 6.0

В настоящее время вы можете создать представление.

1 голос
/ 08 июля 2010

Либо вы можете вернуть производный, когда хотите, через

SELECT COUNT(1) as total FROM invoice_items

Или, если счета могут быть несколько,

//assuming that invoice_items.num is how many there are per row
SELECT SUM(num) as total FROM invoice_items

Или вы можете использовать ПРОСМОТР, если у вас есть определенный способ, которым вы хотите, чтобы он постоянно отображался.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...