CakePHP属于与变量“model”字段的关系

时间:2010-03-11 13:51:22

标签: php cakephp

我在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之类的东西,但我不确定这会对我有所帮助。

2 个答案:

答案 0 :(得分:4)

如果我理解正确,听起来像多态行为是一个很好的答案。它允许您将给定Action记录与任何其他模型(在您的情况下为TransactionTag)绑定。如果您然后检索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_idmodel字段。对于每个Alert记录,这些记录分别包含唯一标识符和型号名称(例如User)。听起来这很符合您的需求。

答案 1 :(得分:0)

所以,如果我是正确的,你想自动将数据保存到Actions表中?也许其他用户会给出可能的答案,但据我所知,这不是。

查看模型回调'afterSave()'可能是个好主意。在这里,您可以在完成其他查询后执行save()。