2012-04-11 2 views
1

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

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

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()); 
} 

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

+0

Любые обновления, пожалуйста. Поскольку я действительно запутался и хочу, чтобы это исправлено. – Cameron

ответ

2

Для дружеских отношений вы должны использовать 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'); 
} 

Удалите вашу нынешнюю модель Друзей, поскольку она не нужна и, возможно, путает Торт.

Ваш метод getFriends() будет выглядеть следующим образом:

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

Здесь мы ищем на модели пользователя и включают в себя все, что пользователя Friend записей. 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 
       ) 
     ) 
) 

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

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

+0

Дает мне эту ошибку: Модель «Друг» не связана с моделью «Отправитель» 'Ошибка: SQLSTATE [42S22]: Столбец не найден: 1054 Неизвестный столбец 'Sender.username' в 'where clause' SQL Query: SELECT' Friend '.'id',' Friend'.'username', 'Friend'.'password',' Friend'.'email', 'Friend'''status',' Friend'.'code', 'Friend'. 'lastlogin' FROM' db52704_favorr'.'sers' AS 'Friend' WHERE' Sender'.'username' = 'cameron' AND 'Friend'.status' = 1' – Cameron

+0

Я ничего не изменил в своей модели Friend (это все еще как в моем OP), так и их то, что мне нужно делать там, что вы еще не отправили? Спасибо – Cameron

+0

Это не соединение модели Отправителя. Убедились ли вы, что «Containable» прикреплен к модели Friend. Или вы можете попробовать «рекурсивный», чтобы проверить это. – jeremyharris

Смежные вопросы