Множественные отношения к одной таблице в CakePHP

В моем приложении пользователь может дружить с другим пользователем. Таким образом, у них есть много разных отношений между двумя таблицами. Таким образом: Users > Friends < Users

Таблицы выглядят так:

 Users: id username password Friends: id user_id_from user_id_to 

и я установил Модели таким образом:

 class User extends AppModel { public $name = 'User'; public $hasOne = 'Profile'; public $hasMany = array( 'Post', 'Answer', 'Friend' ); public $actsAs = array('Containable'); } class Friend extends AppModel { var $name = 'Friend'; var $belongsTo = array( 'Sender' => array( 'className' => 'User', 'foreignKey' => 'user_id_from' ), 'Recipient' => array( 'className' => 'User', 'foreignKey' => 'user_id_to' ) ); public $actsAs = array('Containable'); } 

Однако, похоже, они не связывают их должным образом?

Я использую этот код внутри модели пользователя:

 public function getFriends($username) { return $this->find('all', array('conditions' => array('User.username' => $username, 'Friend.status'=>1) )); } 

а затем при посещении URL-адреса, например /users/USERNAME/friends он должен перечислить друзей для этого человека. Метод, который вызывает это:

 public function index( $username ) { $friends = $this->User->getFriends($username); $this->set('friends', $this->paginate()); } 

В чем проблема?

Для дружеских отношений вы должны использовать HABTM вместо hasMany.

 class User extends AppModel { public $name = 'User'; public $hasOne = 'Profile'; public $hasMany = array( 'Post', 'Answer', ); public $hasAndBelongsToMany = array( 'Friend' => array( 'className' => 'User', 'joinTable' => 'friends', 'foreignKey' => 'user_id_to', 'associationForeignKey' => 'user_id_from', ) ); public $actsAs = array('Containable'); } 

Удалите текущую модель Friend, поскольку она не нужна и, возможно, запутает Cake.

Ваш getFriends() будет выглядеть так:

 public function getFriends($username) { return $this->find('all', array( 'conditions' => array( 'User.username' => $username, 'User.status'=>1 ), 'contain' => array( 'Friend' ) )); } 

Здесь мы ищем модель User и включаем все записи этого пользователя. Cake автоматически получит данные таблицы соединений и включит данные пользователя. $this->User->getFriends('Jeremy'); вернет данные, которые выглядят следующим образом:

 Array ( [User] => Array ( [id] => 1 [username] => Jeremy ) [Friend] => Array ( [0] => Array ( [id] => 2 [username] => Cameron ) [1] => Array ( [id] => 3 [name] => Mark ) [2] => Array ( [id] => 4 [name] => Bob ) ) ) 

Каждый ключ Друга здесь является фактически результатом модели пользователя.

Вы можете узнать больше о HABTM здесь: http://book.cakephp.org/2.0/ru/models/associations-linking-models-together.html#hasandbelongstomany-habtm