Таблица дружбы должна иметь следующие столбцы:
id Integer
user_from (the user who requested friendship)
user_to (the user who accepted friendship)
created (optional to track when your friendship started)
Затем необходимо создать правильное отношение модели.
class User extends AppModel {
...
var $hasMany = array(
'UserFrom'=>array(
'className'=>'Friendship',
'foreignKey'=>'user_from'
),
'UserTo'=>array(
'className'=>'Friendship',
'foreignKey'=>'user_to'
)
);
var $hasAndBelongsToMany = array(
'Friendship' => array(
'className' => 'User',
'joinTable' => 'friendships',
'foreignKey' => 'user_from',
'associationForeignKey' => 'user_to'
);
...
}
class Friendship extends AppModel {
...
var $belongsTo = array(
'UserFrom'=>array(
'className'=>'User',
'foreignKey'=>'user_from'
),
'UserTo'=>array(
'className'=>'User',
'foreignKey'=>'user_to'
)
)
...
}
Таким образом, вы определяете 2 отношения в каждой модели.Вы также можете добавить отношение HABTM.Запустите скрипт bake для построения ваших контроллеров и представлений.Тогда в вашем коде вы можете использовать что-то вроде этого:
$this->User->UserFrom->find('all',
array(
'conditions'=>array('user_from'=>1),
'contain'=>array('UserTo')
)
);
Это должно вернуть друзей пользователя с идентификатором 1 и всеми данными друзей.
Будьте осторожны с рекурсивными запросами.:)