IO v6. AutoIncrement, зависящий от полей
Описание
Бывают случаи, когда требуется создать специальное autoincrement поле, которое будет зависеть от другого поля.
Пример
Есть инвойсы, которые у каждой компании свои (имеют разный company_pkid), и у этих инвойсов есть поле number, которое должно инкрементироваться у каждой компании по своему.
Чтобы это реализовать, нам нужно создать таблицу io_sequence со следующим содержимым:
CREATE TABLE `io_sequence` (
`table` varchar(255) NOT NULL COMMENT 'таблица, для которой нужен подобный автоинкремент для ее поля',
`field` varchar(255) NOT NULL COMMENT 'инкрементирующее поле из таблицы table',
`seq` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'значение автоинкремента',
`company_pkid` bigint(20) unsigned DEFAULT NULL COMMENT 'одно из возможных зависящих полей для автоинкремента'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='специальные автоинкременты';
table- таблица, для которой нужен подобный автоинкремент для ее поляfield- инкрементирующее поле из таблицыtableseq- значение автоинкрементаcompany_pkid- одно из возможных зависящих полей для автоинкремента
К сожалению, стандартными средствами в самой базе MySQL это не сделать, но можно через код. В требуемом месте нужно прописать следующий код:
global $capsuledb, $ioSession;
$company_pkid = $ioSession->user->getCompanyID();
$r = $capsuledb->table('io_sequence')->updateOrInsert(
[
'table' => 'invoices',
'field' => 'invoice_number',
'company_pkid' => $company_pkid,
],
[
'seq' => $capsuledb::raw('`seq` + 1'),
]
);
$r = $capsuledb->table('io_sequence')->where([
['table', '=', 'invoices'],
['field', '=', 'invoice_number'],
['company_pkid', '=', $company_pkid],
])->first();
$invoice_number = xarr($r, 'seq');