2016-09-12 1 views
0

У меня есть таблица заказов с первичным ключом OrderGuid. Это 32-битный уникальный идентификатор, который используется многими частями системы для отслеживания заказа.Laravel/MySQL: Increment StoreOrderNumber на основе StoreGuid

Это, к сожалению, не самый красивый фрагмент данных, и поэтому было решено, что нам понадобится поле StoreOrderNumber. Это будет уникальное целое число для каждого StoreGuid в таблицах заказов. Он также должен быть автоматически увеличивающимся, например. первый заказ, добавленный в таблицу для заданного StoreGuid, будет присвоен StoreOrderNumber из 1, следующих 2, затем 3 и т. д. Каждый заказ для определенного StoreGuid будет соответствовать той же нумерации для StoreOrderNumber, т.е. начиная с 1, затем 2, 3 , 4 ...

Я полностью нарисовал пробел о том, как я могу это сделать в Laravel и MySQL. Существует опция инкремента, которая может быть добавлена ​​в поле в таблице, но это не учитывает, что нам нужно только увеличивать для каждого нового порядка для определенного StoreGuid.

+-----------+-----------+------------------+ 
| OrderGuid | StoreGuid | StoreOrderNumber | 
+-----------+-----------+------------------+ 
| aaa111 | abc123 |    1 | 
| bbb222 | abc123 |    2 | 
| ccc333 | xyz789 |    1 | 
| ddd444 | xyz789 |    2 | 
| eee555 | abc123 |    3 | 
| fff666 | xyz789 |    3 | 
+-----------+-----------+------------------+ 
+0

Я не понимаю вашу проблему, но я думаю, что мутаторы laravel могут решить вашу проблему: https://laravel.com/docs/5.3/eloquent-mutators#defining-a-mutator Вы можете добавить логику для указанный элемент модели (столбец), например выберите максимальное значение для предоставленных условных выражений, а затем установите для этого элемента значение + 1. – Mishek

+0

Пример таблицы добавлен –

ответ

1

Вы должны иметь возможность сделать это с помощью MySQL TRIGGER.

Что-то вроде этого (непроверенные, но получает представление в поперечнике):

CREATE TRIGGER SetStoreOrderNumber BEFORE INSERT ON Orders 
FOR EACH ROW BEGIN 
    SET NEW.StoreOrderNumber = (
     SELECT (COALESCE(MAX(StoreOrderNumber), 0) + 1 
     FROM Orders 
     WHERE Orders.StoreGuid = NEW.StoreGuid 
    ); 
END 

COALESCE необходимо, чтобы создать первый заказ в новом магазине, потому что MAX(StoreOrderNumber)NULL будет.

+0

Ах да! Триггеры! Я помню их сейчас. Отдаю это и дам вам знать. Благодарю. –

Смежные вопросы