假设我有一个名为position的表,我保存每台计算机,显示器或打印机的坐标。
+-----------------+
| key | type | id |
+-----------------+
| 1 | PC | 1 |
| 2 | PC | 2 |
| 3 | MO | 1 |
+-----------------+
在这种情况下,type和id是主键。 我读过Cake不支持复合主键,并建议使用直接查询。那真的没有解决方法吗?将PC的坐标直接保存在PC表或表格中,尤其是PC位置是否更好?这很难吞下去。
答案 0 :(得分:2)
你可以使复合主键工作,但这样做并不简单(总之,将其中一个字段作为primaryKey处理/指定,并使用回调处理另一个;需要覆盖{ {3}},为任何关联添加条件) - 如果可以这样做,则更容易向表中添加唯一键 - 这将允许正常使用并且全面“它只是起作用”-ness。
知道你在问题中得到的是多态关联(位置属于PC,位置属于MO),而可以将这两个字段视为他们真正表达的主键关联 - Model::exists可能对您有用,它还包含使用可能与您的用例相关的条件定义模型关联的示例。
例如,基于问题中的信息,此架构将使用法更容易:
CREATE TABLE `positions` (
`id` int(11) unsigned NOT NULL auto_increment, // <- added
`type` varchar(30) NOT NULL,
`foreign_id` int(11) unsigned NOT NULL, // <- called "id" in the question
`key` int(11) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY (`foreign_id`, `type`)
);
这将是逆模型关联的一个例子:
class Pc extends AppModel {
public $hasOne = array(
'Position' => array(
'foreignKey' => 'foreign_id',
'conditions' => array('Position.type' => 'PC'),
'dependent' => true
)
);
}