Связь кастомной таблицы с таблицей Битрикс - uniqcle/Bitrix GitHub Wiki
Настройки -> Производительность -> Таблицы
Настройки -> Инструменты -> SQL запрос
Создаем свою таблицу
create table hospital_clients (
id INTEGER NOT NULL auto_increment PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50),
age TINYINT(4),
doctor_id TINYINT(4),
procedure_id TINYINT(4),
contact_id INT(11)
);
insert into hospital_clients (id, first_name, last_name, age, doctor_id, procedure_id, contact_id) values (1, 'Владислав', 'Михайлов', 38, 69, 51, 1);
insert into hospital_clients (id, first_name, last_name, age, doctor_id, procedure_id, contact_id) values (4, 'Екатерина', 'Шарова', 30, 73, 46, 7);
insert into hospital_clients (id, first_name, last_name, age, doctor_id, procedure_id, contact_id) values (5, 'Глеб', 'Титов', 33, 73, 50, 3);
Включаем галочку Разрешить генерацию таблетов для ORM
Настройки-Настройки продукта-Настройки модулей-Монитор производительности-Генератор таблетов-Разрешить генерацию таблетов для ORM
В контекстом меню таблицы генерируем ORM
Далее добавляем в модели.
/local/app/Models/Lists/HospitalClientsTable.php
namespace Models;
use Bitrix\Main\Localization\Loc;
use Bitrix\Main\ORM\Data\DataManager;
use Bitrix\Main\ORM\Fields\IntegerField;
use Bitrix\Main\ORM\Fields\StringField;
use Bitrix\Main\ORM\Fields\Validators\LengthValidator;
use Bitrix\Main\ORM\Fields\Validators\RegExpValidator,
Bitrix\Main\ORM\Fields\Relations\Reference,
Bitrix\Main\ORM\Fields\Relations\OneToMany,
Bitrix\Main\Entity\Query\Join;
/**
* Class ClientsTable
**/
class HospitalClientsTable extends DataManager
{
/**
* Returns DB table name for entity.
*
* @return string
*/
public static function getTableName()
{
return 'hospital_clients';
}
/**
* Returns entity map definition.
*
* @return array
*/
public static function getMap()
{
return [
new IntegerField(
'id',
[
'primary' => true,
'autocomplete' => true,
'title' => Loc::getMessage('CLIENTS_ENTITY_ID_FIELD'),
]
),
new StringField(
'first_name',
[
'validation' => function()
{
return[
new LengthValidator(null, 50),
];
},
'title' => Loc::getMessage('CLIENTS_ENTITY_FIRST_NAME_FIELD'),
]
),
new StringField(
'last_name',
[
'validation' => function()
{
return[
new LengthValidator(null, 50),
];
},
'title' => Loc::getMessage('CLIENTS_ENTITY_LAST_NAME_FIELD'),
]
),
new IntegerField(
'age',
[
'title' => Loc::getMessage('CLIENTS_ENTITY_AGE_FIELD'),
]
),
new IntegerField(
'doctor_id',
[
'title' => Loc::getMessage('CLIENTS_ENTITY_DOCTOR_ID_FIELD'),
]
),
new IntegerField(
'procedure_id',
[
'title' => Loc::getMessage('CLIENTS_ENTITY_PROCEDURE_ID_FIELD'),
]
),
new IntegerField(
'contact_id',
[
'title' => Loc::getMessage('CLIENTS_ENTITY_CONTACT_ID_FIELD'),
]
),
// виртуальное поле CONTACT которое получает запись из таблицы контактов
// где ID равен значению contact_id таблицы hospital_clients
(new Reference('CONTACT', \Bitrix\CRM\ContactTable::class,
Join::on('this.contact_id', 'ref.ID')))
->configureJoinType('inner'),
];
}
}
Проверить соответствие
namespace Models;
use Bitrix\Main\Localization\Loc;
use Bitrix\Main\ORM\Data\DataManager;
use Bitrix\Main\ORM\Fields\IntegerField;
use Bitrix\Main\ORM\Fields\StringField;
use Bitrix\Main\ORM\Fields\Validators\LengthValidator;
use Bitrix\Main\ORM\Fields\Validators\RegExpValidator,
Bitrix\Main\ORM\Fields\Relations\Reference,
Bitrix\Main\ORM\Fields\Relations\OneToMany,
Bitrix\Main\Entity\Query\Join;
class HospitalClientsTable extends...
а также связку с таблицей битрикс CRM
// виртуальное поле CONTACT которое получает запись из таблицы контактов
// где ID равен значению contact_id таблицы hospital_clients
(new Reference('CONTACT', \Bitrix\CRM\ContactTable::class,
Join::on('this.contact_id', 'ref.ID')))
->configureJoinType('inner'),
Вывод в скрипте
use Bitrix\Main\Type;
use Models\Lists\CarsPropertyValuesTable as CarsTable;
use Models\HospitalClientsTable as Clients;
use Models\BookTable as Books;
use Models\PublisherTable as Publishers;
use Models\AuthorTable as Authors;
use Models\WikiprofileTable as Wikiprofiles;
// кастомная таблица и стандартная сущность Битрикс
// получение данных из hospital_clients
// получаем контакты CRM привязанные к своей таблице
$collection = Clients::getList([
'select' => [
'id',
'first_name',
'contact_id',
'CONTACT.*'
],
'limit'=>3
])->fetchCollection();
foreach ($collection as $key => $record) {
debug($record->getId().' '.$record->getFirstName().' '.$record->getContactId());
debug($record->getContact()->getPost());
debug($record->getContact()->getCompanyId());
debug($record->getContact()->getTypeId());
//debug($record->getContact()->getLastActivityTime());
}