alexpago / bitrix-models
Bitrix - 模型
Requires
- php: >=8.0
README
该模块允许轻松访问 Bitrix CMS 中的信息块和 Highload 块。
当前模块不使用其他依赖项,仅作为 D7 内核的 facade。
安装
composer require alexpago/bitrix-models
- 安装模块
- 为方便创建模型,在 bin/model 路径下创建二进制文件。文件内容
#!/usr/bin/env php <?php declare(strict_types=1); $_SERVER['DOCUMENT_ROOT'] = str_replace('/bin', '', getenv('PWD')); require_once $_SERVER['DOCUMENT_ROOT'] . '/vendor/alexpago/bitrix-models/src/Console/bin/generate';
自动创建模型
要创建信息块模型,执行命令 php bin/model iblock
。执行命令后,将显示信息块列表
Введите идентификаторы инфоблоков через пробел для генерации модели.
или all для всех. Для выхода введите "q".
3 - Услуги CODE: services, API_CODE: services
5 - Сертификаты на услугу CODE: certificates_services, API_CODE: certificates_services
9 - Подарочные карты (Депозиты) CODE: deposits, API_CODE: -
Ввод :
选择要生成的模型。在创建模型的过程中,如果信息块没有 API_CODE,将自动填充。 注意:对于 D7 模块,信息块必须填写 API_CODE。
创建模型后,将创建一个包含示例内容的文件
<?php namespace Pago\Bitrix\Models\Models\Catalog; use Bitrix\Iblock\ORM\ValueStorage; use Bitrix\Main\ORM\Objectify\Collection; use Pago\Bitrix\Models\IModel; /** * Для вызова методов getProperty и получения значения используйте метод getValue() * @method ValueStorage getCml2Service() // Привязка к услуге * @method Collection getIncludedInPrice() // Что входит в стоимость * @method ValueStorage getAppName() // Название (для приложения) * @method Collection getSalons() // Салоны * @method $this whereCml2Service(mixed $data, string $operator = '') // Привязка к услуге * @method $this whereIncludedInPrice(mixed $data, string $operator = '') // Что входит в стоимость * @method $this whereAppName(mixed $data, string $operator = '') // Название (для приложения) * @method $this whereSalons(mixed $data, string $operator = '') // Салоны */ class CertificatesServices extends IModel { }
手动创建模型
信息块:需要创建一个继承自 Pago\Bitrix\Models\IModel
类的类
类名应与信息块字符编码的 camelSpace 名称相对应。
示例:信息块字符编码为 certificates_services,则类名应为 CertificatesServices
可选:如果需要字符编码与类名不同,则必须填写常量 const IBLOCK_CODE
,指定信息块字符编码。
示例
<?php namespace Pago\Bitrix\Models\Models\Catalog; use Pago\Bitrix\Models\IModel; class CertificatesServicesModel extends IModel { const IBLOCK_CODE = 'certificates_services'; }
可选:如果信息块标识符在所有项目中都是静态的,则建议填写常量 const IBLOCK_ID
。这样系统就不需要确定信息块标识符,从而节省一个 SQL 查询。 示例:
<?php namespace Pago\Bitrix\Models\Models\Catalog; use Pago\Bitrix\Models\IModel; class CertificatesServicesModel extends IModel { const IBLOCK_ID = 3; }
获取元素
类的工作方式与 Bitrix D7 查询类似。
基本查询
$elements = CertificatesServices::query()->withProperties()->get(); // get() вернет массив элементов foreach ($elements as $element) { }
带过滤和限制的基本查询
CertificatesServices::query()->setFilter(['CODE' => 'massage'])->setLimit(10)->get();
注意:可以使用缩写形式安装限制
->limit(10)
或将第一个参数传递给->get(10)
。例如:CertificatesServices::query()->get(10)
注意:设置偏移量
->setOffset(50)
或->offset(50)
或将值作为第二个参数传递给->get(10, 50)
。例如:CertificatesServices::query()->get(10, 50)
逐步填充过滤器
方法 setFilter
设置过滤器,如果之前已设置条件,则取消设置。
代替 setFilter
,可以使用 where(column, operator, value)
。
在 where
条件后使用 orWhere(column, operator, value)
搜索 OR。
同时存在简化字段过滤的选项 whereColumn(value, operator)
。Column 必须填写在 CamelSpace 中。所有字段都可用,包括信息块属性。 例如:属性代码为 CITY_ID
的属性可以过滤为 whereCityId(value)
注意:operator 默认为 = (等于)
注意:如果执行
setFilter
后执行where
或whereColumn
,则之前的值将被清除,并且仅考虑setFilter
中的数据
过滤示例
CertificatesServices::query() ->withProperties() ->whereCityId(1) ->orWhere('CITY_ID', 2) ->whereIblockSectionId(10) ->whereId(5, '>=') // по умолчанию всегда оператор = (равно), заполнять при необходимости указать другой ->get();
获取一个元素
CertificatesServices::query()->whereId(100)->first(); // first() вернет экземпляр класса
选择
默认情况下,如果不指定 setSelect
,则将选择信息块的所有字段(不包括属性)。要获取所有属性,必须调用方法 withProperties
。
示例
CertificatesServices::query()->withProperties()->get();
选择填充示例
// SALONS и CITY - свойства инфоблока. Обратите внимание, префикс PROPERTY указывать не нужно CertificatesServices::query()->setSelect(['ID', 'CODE', 'NAME', 'SALONS', 'CITY'])->get();
选择逐步填充示例
// SALONS и CITY - свойства инфоблока. Обратите внимание, префикс PROPERTY указывать не нужно CertificatesServices::query()->select('ID')->select('CODE', 'NAME')->get();
选择逐步填充和导出所有属性的示例
// SALONS и CITY - свойства инфоблока. Обратите внимание, префикс PROPERTY указывать не нужно CertificatesServices::query()->withProperties()->select('ID')->select('CODE', 'NAME')->get();
注意:不建议在不必要的情况下加载所有属性 注意:
DETAIL_PAGE_URL
不属于元素。要获取它,请使用方法getDetailPageUrl()
。如果需要提前获取详细页面的列表,请在 get 之前使用withDetailPageUrl()
获取 detail page url
的示例
// SALONS и CITY - свойства инфоблока. Обратите внимание, префикс PROPERTY указывать не нужно $element = CertificatesServices::query()->withDetailPageUrl()->select('ID')->first(); $element->getDetailPageUrl();
元素数量
获取元素数量的示例
// SALONS и CITY - свойства инфоблока. Обратите внимание, префикс PROPERTY указывать не нужно CertificatesServices::query()->where('ID', '>=', 1)->count();
排序
排序是通过通过方法 setOrder
填充数组或通过填充 order(column)
和 orderDesc(column)
来实现的
示例
CertificatesServices::query()->setOrder(['ID' => 'ASC'])->get();
填充示例
CertificatesServices::query()->order('ID')->orderDesc('NAME')->get();
注意:如果执行
setOrder
在order
或orderDesc
之后,则前面的值将被清除,并且只会考虑setOrder
的数据
缓存
可以缓存查询。为此,请使用 withCache()
。该方法接受两个参数:缓存的有效期(以秒为单位)和用于缓存 join 的布尔值。还可以在类中预先定义属性 public int $cacheTtl
和 public bool $cacheJoin
。
示例请求:缓存一小时,并缓存 join
$elements = CertificatesServices::query()->withCache(3600, true)->get();
如果类中设置了默认缓存,则可以通过方法
withoutCache()
关闭特定请求的缓存
结果转换
默认情况下,数据以 ORM D7 对象返回。
处理请求的示例
$elements = CertificatesServices::query()->withProperties()->get(); foreach ($elements as $element) { // Свойство SALONS множественное // Экземпляр класса Bitrix\Main\ORM\Objectify\Collection $salons = $element->getSalons(); foreach ($salons as $salon) { $salon->getValue(); } // Свойство CITY не множественное // Экземпляр класса Bitrix\Iblock\ORM\ValueStorage $city = $element->getCity()->getValue(); }
也可以将结果转换为数组
示例
$elements = CertificatesServices::query()->get(); foreach ($elements as $element) { $result = $element->toArray(); }
注意:方法 toArray 也会返回依赖关系。例如
IBLOCK_ELEMENT_ID
。要获取仅VALUE
的值,请使用$element->toArrayOnlyValues()
操作
模型有快速操作。
删除元素
任何元素都可以通过一个命令来删除
$element = CertificatesServices::query()->withProperties()->first(); // Массив с результатом [Bitrix\Main\ORM\Data\Result] $element->delete(); // Для получения результата в bool $element->elementDelete();
也可以根据过滤器删除元素,而不获取其实例
// Массив с результатом [Bitrix\Main\ORM\Data\Result] $delete = CertificatesServices::query()->withProperties()->whereActive(false)->delete();
更新元素
通过将新属性赋值给它并通过调用方法 save()
来更新元素,通过魔术方法 __set 来进行更新。
$element = CertificatesServices::query()->withProperties()->first(); $element->NAME = 'Новое имя'; $element->SALON_ID = 135; // Свойство инфоблока SALON_ID // Результат сохранения Bitrix\Main\ORM\Data\Result $element->save();
也可以使用方法 update()
$element = CertificatesServices::query()->withProperties()->first(); // Массив с результатом [Bitrix\Main\ORM\Data\Result] $element->update([ 'NAME' => 'Новое имя' ]); // Результат запроса Bitrix\Main\ORM\Data\Result $element->elementUpdate([ 'NAME' => 'Новое имя 2' ]);
可以将 update()
方法应用于 query
查询,类似于 delete()
$data = [ 'ACTIVE' => true ]; // Массив с результатом [Bitrix\Main\ORM\Data\Result] $delete = CertificatesServices::query()->withProperties()->whereActive(false)->update($data);
创建元素
创建新元素类似于更新,通过 save()
。首先需要创建对象实例并填写其数据。填写完毕后,调用方法 save()
。
$element = new CertificatesServices(); $element->NAME = 'Имя нового элемента'; // Результат сохранения Bitrix\Main\ORM\Data\Result $element->save();
事件
可以在模型中为添加、更改和删除元素添加事件。以下事件可用:
/** * Событие вызываемое перед добавлением элементам * @return void */ protected function onBeforeAdd(): void { // actions } /** * Событие вызываемое после добавление элемента * @param \Bitrix\Main\ORM\Data\Result $result * @return void */ protected function onAfterAdd(Result $result): void { // actions } /** * Событие вызываемое перед обновлением элемента * @return void */ protected function onBeforeUpdate(): void { // actions } /** * Событие вызываемое после обновления элемента * @param \Bitrix\Main\ORM\Data\Result $result * @return void */ protected function onAfterUpdate(Result $result): void { // actions } /** * Событие вызываемое перед удалением элемента * @return void */ protected function onBeforeDelete(): void { // actions } /** * Событие вызываемое после удаления элемента * @param \Bitrix\Main\ORM\Data\Result $result * @return void */ protected function onAfterDelete(Result $result): void { // actions }
要获取更改的属性列表,可以使用方法
getChangedProperties
示例
protected function onBeforeUpdate(): void { $data = $this->getProperties(); // Текущие свойства $originalData = $this->getOriginalProperties(); // Свойства при инициализации модели $changedData = $this->getChangedProperties(); // Измененные свойства // Можно предопределить данные $this->NAME .= ' Обновлено'; }