CakePHP 2复合主键

时间:2014-03-05 08:44:20

标签: mysql sql cakephp

假设我有一个名为position的表,我保存每台计算机,显示器或打印机的坐标。

+-----------------+
| key | type | id |
+-----------------+
| 1   | PC   | 1  |
| 2   | PC   | 2  |
| 3   | MO   | 1  |
+-----------------+

在这种情况下,type和id是主键。 我读过Cake不支持复合主键,并建议使用直接查询。那真的没有解决方法吗?将PC的坐标直接保存在PC表或表格中,尤其是PC位置是否更好?这很难吞下去。

1 个答案:

答案 0 :(得分:2)

版本3

之前不支持 在CakePHP版本3之前不支持

Composite primary keys

可以使复合主键工作,但这样做并不简单(总之,将其中一个字段作为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 
        ) 
    ); 
}