如何用CakePHP处理自连接
自连接,就是自己引用自己,比如员工表,某个员工的上司也保存到员工表中, 那么想要同时得到一个员工和他的上司的信息就得使用自连接。 表如下所示:
employees
PK | id | INT | 自动编号id |
name | VARCHAR(64) | 员工姓名 | |
FK | super_id | INT | 上司id,引用自身 |
那么查询时就需要这样写:
SELECT A.name,B.name FROM t_employees A, t_employees B
WHERE A.parent_id=B.id
而在CakePHP中如何实现,就需要一点小技巧。 这篇文章 简单介绍了如何做到这一点,其实不难,能把model建好了就80%了。
原文讲得比较罗嗦, 我就不再重复了,仅将要点写在这里。
Model如下:
<?php
class Employee extends AppModel {
var $name = 'Employee';
var $belongsTo = array(
'ParentEmployee' => array(
'className' => 'Employee',
'foreignKey' => 'super_id'
)
);
var $hasMany = array(
'ChildEmployee' => array(
'className' => 'Employee',
'foreignKey' => 'super_id'
)
);
}
?>
这里的关键是要处理好belongsTo和hasMany两个关系。虽然是自己引用自己的, 但是在确定关系时一定要仔细处理好。
就说到这里,在表中通过 findById 得到的员工信息如下所示。 至于怎么用,大家自己看着用吧。
Array
(
[Employee] => Array
(
[id] => 1
[name] => John
[super_id] => 0
)
[ParentEmployee] => Array
(
[id] =>
[name] =>
[super_id] =>
)
[ChildEmployrr] => Array
(
[0] => Array
(
[id] => 2
[name] => Marry
[super_id] => 1
)
[1] => Array
(
[id] => 3
[name] => Larry
[super_id] => 1
)
)
)