Если я правильно понимаю, звучит так, что Полиморфное поведение - отличный ответ. Это позволяет вам привязать запись Action
к любой другой модели (в вашем случае, Transaction
или Tag
). Если вы затем извлекаете Action
- и память служит (я использовал это только один раз) - тогда соответствующая модель также вернется (при условии соответствующей настройки recursive
).
В качестве примера, в недавнем проекте я построил модель Alert
. Оповещения могут быть прикреплены к любой модели. В каждой записи оповещения указывается, к какой модели она относится, и соответствующий идентификатор записи:
class Alert extends AppModel {
public $actsAs = array (
'Polymorphic' => array (
'classField' => 'model',
'foreignKey' => 'entity_id'
)
);
# Additional model code
}
И мой стол был построен по следующей спецификации:
CREATE TABLE alerts (
id CHAR(36) NOT NULL,
alert_template_id VARCHAR(255) NOT NULL,
model VARCHAR(255) NOT NULL,
entity_id CHAR(36) NOT NULL,
valid_from BIGINT NULL,
valid_to BIGINT NULL,
replacement_keys TEXT NULL,
active BOOL NOT NULL DEFAULT 0,
created BIGINT NOT NULL,
updated BIGINT NOT NULL,
PRIMARY KEY(id),
FOREIGN KEY(alert_template_id)
REFERENCES alert_templates(id)
ON DELETE NO ACTION
ON UPDATE NO ACTION
)TYPE=InnoDB DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
Обратите внимание на поля entity_id
и model
. Для каждой записи Alert
они содержат уникальный идентификатор и название модели (например, User
) соответственно. Похоже, что это удовлетворит ваши потребности.