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