CakePhp 1.3.4 $ Счастливый проблем в случае таблицы отношений

StackOverflow https://stackoverflow.com/questions/3801838

Вопрос

У меня есть таблица под названием user_relationship. У кого есть два иностранных ключей, ссылающихся на таблицу пользователя, чтобы отобразить, что они друзья.

CREATE TABLE `user_relationships` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `status` varchar(255) default 'pending',
  `time` datetime default NULL,
  `user_id` int(11) unsigned NOT NULL,
  `friend_id` int(11) unsigned NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `fk_user_relationships_users1` (`user_id`),
  KEY `fk_user_relationships_users2` (`friend_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

Когда я пытаюсь выпекать его, естественно, не понимает, что Friend_id должен ссылаться на пользовательский модуль. Я хочу ручное редактировать код, но у некоторых проблем понять, какие части для редактирования в следующем

var $belongsTo = array(
    'User' => array(
        'className' => 'User',
        'foreignKey' => 'user_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    ),
    'Friend' => array(
        'className' => 'Friend',
        'foreignKey' => 'friend_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    )
);

В этой части кода я хочу ссылаться на пользователя Friend_id в таблицу пользователя

    'Friend' => array(
        'className' => 'Friend',
        'foreignKey' => 'friend_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    )

Я пытался сделать это .. Мне нужно менять что-нибудь еще?

    'Friend' => array(
        'className' => 'Friend',
        'foreignKey' => 'user_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    )
Это было полезно?

Решение

Как насчет этого?

class UserRelationship {

    var $belongsTo = array(
        'User' => array(
            'className' => 'User',
            'foreignKey' => 'user_id'
        ),
        'Friend' => array(
            'className' => 'User',
            'foreignKey' => 'friend_id'
        )
    );

}

class User {

    var $hasAndBelongsToMany = array(
        'Friend' => array(
            'className' => 'User',
            'joinTable' => 'user_relationships',
            'foreignKey' => 'user_id',
            'associationForeignKey' => 'friend_id',
            'with' => 'UserRelationship'
         )
    );

}

Ассоциации можно увидеть из разных точек зрения:

User        <-    Relationship    ->     User
 |                     |                  |
 hasMany           belongsTo              |
 Relationship  <-  User (user_id)        hasMany
 |                 User (friend_id)  ->  Relationship
 |                                        |
 HABTM                                   HABTM
 User       <---------------------->     User

Ваш «физический» макет, то есть схема базы данных, является User -> Relationship -> User. Отказ Ваши настоящие желаемые отношения User -> User отношения, хотя. Технически, что переводит в User hasAndBelongsToMany User Ассоциация (также называется многими к-многим). Поскольку он использует три модели, ассоциация многих ко многим может быть разбита в:

  • Пользователь Hasmany отношения / отношения, принадлежащие пользователю
  • Отношения, принадлежащие пользователю / пользователю Hasmany отношения

Вы не нужно Ассоциация Хасаанбелонгстомания, но это то, что вы на самом деле хотите. Вам не очень нужны модели отношений, поскольку это просто модель помощника для подключения двух пользователей, но если вы делать Хотите также указать его ассоциации, у него есть две причастные ассоциации.

Другие советы

Ваше классновое имя для «друга» не так. Поскольку у вас нет стола «Друзья» Нет модели «друга», и у вас есть ссылка на класс «Пользователь», поскольку они разделяют одну и ту же таблицу.

'Friend' => array(
    'className' => 'User',
    'foreignKey' => 'friend_id',
    'conditions' => '',
    'fields' => '',
    'order' => ''
)

Я смог сойти со следующим:

class User extends AppModel {
    var $hasAndBelongsToMany = array(
        'Friends1' => array(
            'className' => 'User',
            'joinTable' => 'friends',
            'foreignKey' => 'user_id',
            'associationForeignKey' => 'friend_id',
            'with' => 'Friend'
         ),
        'Friends2' => array(
            'className' => 'User',
            'joinTable' => 'friends',
            'foreignKey' => 'friend_id',
            'associationForeignKey' => 'user_id',
            'with' => 'Friend'
         )
    );

    function afterFind(array $results) {

        // Merge both sides of the relationship into one alias
        foreach ($results as $key=>$result) {
            if (isset($result["Friends1"]) && isset($result["Friends2"])) {
                $results[$key]["Friends"] = array_merge($result["Friends1"], $result["Friends2"]);
                unset($results[$key]["Friends1"]);
                unset($results[$key]["Friends2"]);
            }
        }

Это грязно, но вы получаете идею: возьми обе стороны отношений, а затем сливайте их после базы данных :)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top