BMC IO DocsBMC IO Docs
IO v6
IO v7
Notes
Docs
IO v6
IO v7
Notes
Docs
  • IO Framework v6

    • О фреймворке
    • Уроки
    • Структура
    • Доступ к участкам проекта
    • Старые версии фреймворка
    • Разворачивание нового проекта
  • Backend

    • Функции фреймворка
    • Настройки проекта (app/i.php)
    • Настройки composer
    • Глобальные переменные
    • Константы фреймворка
    • Event класс
    • IOCore класс
    • Controller и работа с ними
    • Class и работа с ними
    • Model и работа с ними
    • View и работа с ними
    • Мультиязычность и словарь фраз
    • Bin скрипты и работа с ними
    • Cron скрипты и работа с ними
    • $ioSession и работа с сессией
    • $ioSession->user и работа с пользователем
    • $ioHash и работа с кешем
    • $ioXCache и работа с кешем
    • $iodb и работа с базой данных
  • Frontend

    • Twig шаблонизатор и работа с ним
    • Twig функции
    • Twig фильтры
    • JS плагины
    • Отложенная загрузка JS скриптов
    • Обращение к Model через JS
  • Примеры

    • AutoIncrement, зависящий от полей

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 - инкрементирующее поле из таблицы table
  • seq - значение автоинкремента
  • 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');