Во-первых, соответствующие биты структуры таблицы:
contact
-contactID
-email
data
-value
-contactID
-definitionID
definition
-definitionID
-name
Каждая запись в таблице contact
представляет один контакт вместе с их адресом электронной почты.
Каждая запись в таблице definition
представляет определение пользовательского поля данных.Например, в definition
может быть пять записей - Организация, Почтовый индекс, Комментарии, Адрес, Телефон.В дополнение к именам полей он также определяет соответствующие метаданные о полях.
Каждая запись в таблице data
содержит значение поля пользовательских данных, связанное с контактом.Его определение взято из таблицы definition
.
Чтобы уточнить, если бы я хотел сгенерировать таблицу контактов вместе с данными их настраиваемых полей, он мог бы выглядеть так:
| E-Mail | Organization | Zip Code | Comments | Address | Phone |
-------------------------------------------------------------------------------------------------------------
| sean@example.com | ACME | 12345 | Cool guy! | 123 Test St | 555-5555 |
| sean2@example.com | SomeCo. | 54321 | Doesn't know anything about ORM! | 321 Test Blvd | 444-4444 |
Преимущество этой системы в том, что она может масштабироваться настолько, насколько мне нужно, и ее легко настраивать.Ущерб в том, что я понятия не имею, как определить отношения:)
Я пытался определить contact:data
как 1:M
и definition:data
как 1:M
, но результаты кажутся немного странными:С двумя контактами и одним определением добавление строки к данным для каждого контакта и затем вызов entityLoad( 'Contact' )
приводит к интересным отношениям.Это выглядит так (просто собираюсь использовать некоторую нотацию псевдоструктуры, потому что ее достаточно легко набирать и, я надеюсь, читать):
{
contact: {
email: 'sean@example.com',
data: {
value: 'ACME',
definition: {
name: 'Organization',
data: {
value: 'SomeCo.',
contact: {
email: 'sean2@example.com'
}
}
}
}
}
Похоже, что это создает косвенную связь между contact
и definition
на основе отношения таблицы data
к обеим таблицам.Как вы можете себе представить, увеличение количества контактов и настраиваемых полей только усугубляет проблему.
Возможен ли такой тип отношений с использованием ORM CF9?Как я могу это сделать?
Заранее спасибо!
РЕДАКТИРОВАТЬ: Забыл указать - я использую MySQL, если это важно.
РЕДАКТИРОВАТЬ 2: Определения CFC следуют:
Contact.cfc
/**
* @persistent true
*/
component name='Contact' {
/**
* @type numeric
* @sqltype int(11)
* @generator increment
* @fieldtype id
*/
property contactID;
/**
* @type string
* @sqltype varchar(50)
*/
property email;
/**
* @type array
* @fieldtype one-to-many
* @cfc Data
* @fkcolumn dataID
*/
property data;
}
Definition.cfc
/**
* @persistent true
*/
component name='Definition' {
/**
* @type numeric
* @sqltype int(11)
* @generator increment
* @fieldtype id
*/
property definitionID;
/**
* @type string
* @sqltype varchar(50)
*/
property name;
/**
* @type array
* @fieldtype one-to-many
* @cfc Data
* @fkcolumn dataID
*/
property data;
}
Data.cfc
/**
* @persistent true
*/
component {
/**
* @type numeric
* @sqltype int(11)
* @generator increment
* @fieldtype id
*/
property dataID;
/**
* @type string
* @sqltype varchar(50)
*/
property value;
/**
* @fieldtype many-to-one
* @fkcolumn contactID
* @cfc Contact
* @inverse true
*/
property contact;
/**
* @fieldtype many-to-one
* @fkcolumn definitionID
* @cfc Definition
* @inverse true
*/
property definition;
}