我在CakePHP中遇到了belongsTo关系的问题。
我有一个“动作”模型,它使用“动作”表,属于另外两个模型之一,“交易”或“标记”。这个想法是,无论何时用户完成事务或添加标记,都会创建操作模型以保留其日志。我已经有了这个部分,每当保存一个Transaction或Tag时,aftersave()方法也会添加一个Action记录。当我尝试在Action模型上执行查找('all')时,问题出现了,没有返回相关的Transaction或Tag记录。
动作:
id
model
model_id
created
我以为我可以使用belongsTo关系中的“conditions”参数,如下所示:
<?php
class Action extends AppModel {
var $name = 'Action';
var $actsAs = array('Containable');
var $belongsTo = array(
'Transaction' => array(
'foreignKey' => 'model_id',
'conditions' => array("Action.model"=>"Transaction")
),
'User' => array(
'fields' => array('User.username')
),
'Recommendation' => array(
'conditions' => array("Action.model"=>"Recommendation"),
'foreignKey' => 'model_id'
)
);
}
?>
但这不起作用。
我在这里遗漏了什么,我的关系是否错误(我怀疑如此)?在谷歌搜索这个问题之后,我会看到Polymorphic Behaviour之类的东西,但我不确定这会对我有所帮助。
答案 0 :(得分:4)
如果我理解正确,听起来像多态行为是一个很好的答案。它允许您将给定Action
记录与任何其他模型(在您的情况下为Transaction
或Tag
)绑定。如果您然后检索Action
- 并且内存服务(我只使用过一次) - 那么关联的模型也将返回(假设适当的recursive
设置)。
例如,在最近的一个项目中,我构建了一个Alert
模型。警报可以附加到任何模型。任何给定的警报记录都标识了它所属的模型以及相应的记录ID:
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
)。听起来这很符合您的需求。
答案 1 :(得分:0)
所以,如果我是正确的,你想自动将数据保存到Actions表中?也许其他用户会给出可能的答案,但据我所知,这不是。
查看模型回调'afterSave()'可能是个好主意。在这里,您可以在完成其他查询后执行save()。