我有一个名为user_ryationship的表。其中有两个外国钥匙回到用户表,以映射他们是朋友。

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必须参考用户模块。我想手动编辑代码,但是o有一些问题了解以下内容要编辑哪些部分

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关系

你没有 需要 HasandBelongstomany协会,但这就是您真正想要的。您根本不需要关系模型,因为它只是连接两个用户的帮助模型,但是如果您 想要指定其关联,它具有两个属于属于的关联。

其他提示

您的“朋友”的classname是错误的。由于您没有表“朋友”,因此没有模型“朋友”,因此您可以参考“用户”,因为他们共享同一张表。

'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