自连接,就是自己引用自己,比如员工表,某个员工的上司也保存到员工表中, 那么想要同时得到一个员工和他的上司的信息就得使用自连接。 表如下所示:

employees

PKidINT自动编号id
nameVARCHAR(64)员工姓名
FKsuper_idINT上司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
        )

    )
)