Манипуляции с сущностями или записями в таблицах Битрикс D7
http:// bxit . ru /development/bitrix-coding/razrabotka-na-d7/operatsii-s-sushchnostyami-d7/
Добавление элемента сущности, add():
$result = MynameTalbe::add( array( "field_1" => "val 1", "field_2" => "val 2", "field_3" => "val 3", ) ); if($result->isSuccess()) { $ID = $result->getId(); echo "Добавлен новый элемент: ".$ID; } else { $error = $result->getErrorMessages(); echo "Ошибка добавления нового элемента: <pre>".var_export($error, true)."</pre>"; }
Обновление элемента сущности, update():
$ID = 1; // ID элемента $result = MynameTalbe::update( $ID, array( "field_1" => "val 11", // Поля, которые меняем ) ); if($result->isSuccess()) { echo "Элемент обновлен!"; } else { $error = $result->getErrorMessages(); echo "Ошибка обновления элемента: <pre>".var_export($error, true)."</pre>"; }
Удаление элемента сущности, delete():
$ID = 1; // ID элемента $result = MynameTalbe::delete($ID); if($result->isSuccess()) { echo "Элемент удален!"; } else { $error = $result->getErrorMessages(); echo "Ошибка удаления элемента: <pre>".var_export($error, true)."</pre>"; }
При удалении не существующего элемента ошибки не происходит.
Выборка данных
Получение всех записей, getList():
// Получение всех строк $result = MyTable::getList( array( 'select' => array('PARAMETR_1', 'PARAMETR_2', ..), // имена полей, которые необходимо получить в результате 'filter' => array('PARAMETR_1' => 'val_1', 'PARAMETR_2' => 'val_2', ..), // фильтр выбираемых элементов 'group' => array('PARAMETR_1', 'PARAMETR_2', ..), // явное указание полей, по которым нужно группировать результат 'order' => array('PARAMETR_1' => 'DESC', 'PARAMETR_2' => 'ASC', ..), // поля и направление сортировки 'limit' => number, // количество возвращаемых элементов 'offset' => number, // смещение для limit 'runtime' => array() // динамически определенные поля ) ); // 1. fetch() $rows = array(); while ($row = $result->fetch()) { $rows[] = $row; } // 2. fetchAll() $rows = $result->fetchAll();
Примеры:
// 1С-Битрикс D7 выборка всех элементов инфоблока ID = 13 всего лишь одной строкой $arResult["ITEMS"] = \Bitrix\Iblock\ElementTable::getList(array('filter' => array('IBLOCK_ID' => 13))) -> fetchAll(); // 1С-Битрикс D7 выборка всех элементов инфоблока ID = 13 в цикле $result = \Bitrix\Iblock\ElementTable::getList(array('filter' => array('IBLOCK_ID' => 13))); while ($row = $result->fetch()) { $arResult["ITEMS"][] = $row; }
Получение одной строки, getRow():
$row = MyTable::getRow(array('select' => array(), 'filter' => array(), ..));
Получение по первичному ключу (ID в большинстве случаев), getById():
$row = MyTable::getById($ID)->fetch();
Получение строки записи по первичному ключу (ID в большинстве случаев), getRowById():
$row = MyTable::getRowById($ID);
Получение по первичному ключу (ID в большинстве случаев) записи с параметрами, getByPrimary():
$row = MyTable::getByPrimary(array("ID" => 1), array("select" => array(), "filter" => array(), ..))->fetch();
Фильтр ‘filter’ => array() массив может иметь склейку параметров AND или OR.
По умолчанию стоит AND:
'filter' => array( 'PARAMETR_1' => 1, 'PARAMETR_2' => 2, 'PARAMETR_3' => 3, 'PARAMETR_4' => 4, ) // или так: 'filter' => array( 'LOGIC' => 'AND', array( 'PARAMETR_1' => 1, 'PARAMETR_2' => 2, ), array( 'PARAMETR_3' => 3, 'PARAMETR_4' => 4, ) )
Вариант с OR:
'filter' => array( 'LOGIC' => 'OR', array( 'PARAMETR_1' => 1, 'PARAMETR_2' => 2, ), array( 'PARAMETR_3' => 3, 'PARAMETR_4' => 4, ) )
В фильтре можно использовать операторы сравнения:
'filter' => array( '=PARAMETR_1' => 'val_1', // = равно val_1 '!=PARAMETR_2' => 'val_2', // != не равно val_2 '%PARAMETR_3' => 'val_3', // % ищет подстроку в val_3 '!%PARAMETR_4' => 'val_4', // !% ищет все значения, которых нет подстроки в val_4 '>PARAMETR_5' => 'val_5', // > ищет поля, которые больше, чем val_5 '<PARAMETR_6' => 'val_6', // < ищет поля, которые меньше, чем val_6 '>=PARAMETR_7' => 'val_7', // >= ищет поля, которые больше или равны val_7 '<=PARAMETR_8' => 'val_8', // <= ищет поля, которые меньше или равны val_8 '><PARAMETR_9' => array(MIN, MAX), // >< между, ищет поля, значения которыx попадает в интервал в массиве array(MIN, MAX) '>!<PARAMETR_10' => array(MIN, MAX), // >!< не между, ищет поля, значения которыx не попадают в интервал в массиве array(MIN, MAX) '=%PARAMETR_11' => 'val_11', // =% LIKE '%=PARAMETR_12' => 'val_12', // %= LIKE '!=%PARAMETR_13' => 'val_13', // !=% NOT LIKE '!%=PARAMETR_14' => 'val_14', // !%= NOT LIKE '@ IN (EXPR)PARAMETR_15' => 'val_15', // @ IN (EXPR) в качестве значения передается объект DB\SqlExpression '!@ NOT IN (EXPR)PARAMETR_16' => 'val_16', // !@ NOT IN (EXPR) в качестве значения передается объект DB\SqlExpression )
Параметр ‘runtime’ => array(). Параметр работает так, как будто к сущности было добавлено поле Parametr_cnt, не объявленное в \Bitrix\Main\Entity\DataManager::getMap(). С помощью runtime можно дополнять ORM сущности, например написанные не вами, но будут использоваться только в вашем коде:
$result = MyTable::getList( array( "select" => array( "Parametr_cnt" ), "runtime" => array( new Main\Entity\ExpressionField("Parametr_cnt", COUNT(*)) ) ) ); // или так $result = MyTable::getList( array( "select" => array( new Main\Entity\ExpressionField("Parametr_cnt", COUNT(*)) ) ) ); // или так (тут поле не описано в сущности в getMap(), но создано в таблице mySQL) $result = MyTable::getList( array( "select" => array( "Parametr_1", "Parametr_2", "Parametr_cnt" ), "filter" => array( "Parametr_cnt" => 1 ), "runtime" => array( new Main\Entity\IntegerField("Parametr_cnt") ) ) );