Wiki Bitrix

Заготовка Entity\DataManager для типичной таблицы

Типичная таблица товаров выглядит следующим образом:

ordergoods.php
namespace Vendor\Dealer\Orm\Order;
 
use \Bitrix\Main\Entity;
 
/*
 
Товары из заказа.
 
```
CREATE TABLE `vendor_dealer_order_goods` (
  `ID`            INT(11)      UNSIGNED NOT NULL AUTO_INCREMENT,
  `ORDER_GUID`    CHAR(36)              NOT NULL COMMENT 'GUID заказа в 1С',
  `ART`           CHAR(36)              NOT NULL COMMENT 'артикул',
  `CNT`           INT(11)      UNSIGNED NOT NULL COMMENT 'количество',
  `PRICE`         DECIMAL(16,2)         NOT NULL COMMENT 'цена за штуку',
  `SUM_VAT`       DECIMAL(16,2)         NOT NULL COMMENT 'НДС, сумма',
  `SUM_WITH_VAT`  DECIMAL(16,2)         NOT NULL COMMENT 'сумма с НДС',
  `DATE_BEGIN`    DATE                  NOT NULL COMMENT 'Ожидаемая дата прихода для товаров в пути - "с"',
  `DATE_END`      DATE                  NOT NULL COMMENT 'Ожидаемая дата прихода для товаров в пути - "по"',
  `TYPE`          ENUM('reserved', 'transit', 'ns')   NOT NULL COMMENT 'тип: reserved - "обычный" зарезервированный товар, transit - в пути, ns - НС',
  `PLACE_TYPE`    VARCHAR(255)          NOT NULL COMMENT 'Тип места (f.e. "Склады")',
  `PLACE`         CHAR(36)              NOT NULL COMMENT 'GUID места',
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=cp1251;
 
ALTER TABLE `vendor_dealer_order_goods` ADD KEY(`ORDER_GUID`);
```
 
*/
 
class OrderGoodsTable extends Entity\DataManager {
 
  public static function getTableName() {
    return 'vendor_dealer_order_goods';
  }
 
  public static function getMap() {
    return array(
      new Entity\IntegerField('ID', array(
        'primary' => true
      )),
      new Entity\StringField('ORDER_GUID', array(
        'size' => 36
      )),
      new Entity\StringField('ART', array(
        'size' => 36
      )),
      new Entity\IntegerField('CNT', array()),
      new Entity\FloatField('PRICE', array()),
      new Entity\FloatField('SUM_VAT', array()),
      new Entity\FloatField('SUM_WITH_VAT', array()),
      new Entity\DateField('DATE_BEGIN', array(
        'default_value' => new \Bitrix\Main\Type\Datetime
      )),
      new Entity\DateField('DATE_END', array(
        'default_value' => new \Bitrix\Main\Type\Datetime
      )),
      new Entity\EnumField('TYPE', array(
        'values' => array('reserved', 'transit', 'ns')
      )),
      new Entity\StringField('PLACE_TYPE', array(
        'size' => 255
      )),
      new Entity\StringField('PLACE', array(
        'size' => 36
      ))
    );
  }
 
  public static function truncate() {
    self::getEntity()->getConnection()->queryExecute('TRUNCATE TABLE `vendor_dealer_order_goods`');
  }
 
  public static function deleteByOrderGuid($o_guid) {
    self::getEntity()->getConnection()->queryExecute("DELETE FROM `vendor_dealer_order_goods` WHERE `ORDER_GUID` = '".addslashes($o_guid)."'");
  }
 
  public static function speedAdd($item) {
    $query = sprintf("INSERT INTO `vendor_dealer_order_goods`
      (`ORDER_GUID`, `ART`, `CNT`, `PRICE`,
      `SUM_VAT`, `SUM_WITH_VAT`, `DATE_BEGIN`, `DATE_END`,
      `TYPE`, `PLACE_TYPE`, `PLACE`)
      VALUES
      ('%s', '%s', %d, %F,
        %F, %F, '%s', '%s',
        '%s', '%s', '%s')
      ",
      addslashes($item['ORDER_GUID']), addslashes($item['ART']), $item['CNT'], $item['PRICE'],
      $item['SUM_VAT'], $item['SUM_WITH_VAT'],
        $item['DATE_BEGIN'] ? $item['DATE_BEGIN']->format('Y-m-d') : '0000-00-00',
        $item['DATE_END'] ? $item['DATE_END']->format('Y-m-d') : '0000-00-00',
      addslashes($item['TYPE']), addslashes($item['PLACE_TYPE']), addslashes($item['PLACE'])
    );
    self::getEntity()->getConnection()->queryExecute($query);
  }
 
 
 
 
 
}

В файле описана схема таблицы (DDL).

  • speedAdd - для быстрой вставки данных в таблицу, без обработки событий
  • truncate, deleteByOrderGuid - вспомогательные методы