Манипуляции с сущностями или записями в таблицах Битрикс 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")
)
)
);
