有几种方法可以实现友谊关联,因为友谊中有两个方向。可以说用户 A 是用户 B 的好友,也可以说用户 B 是用户 A 的好友。
当一个人在数据库中建立友谊时。您必须在连接表中创建两条记录来表示双向的这种友谊(假设您想要双向)。
这涵盖了方向的概念。
您可能会遇到记录消失的问题,因为默认情况下,CakePHP 会在记录更新时擦除记录的所有连接数据行。查看 HABTM 上“唯一”选项的描述。
unique:如果为true(默认值),更新记录时,蛋糕将首先删除外键表中现有的关系记录,然后再插入新的关系记录。所以更新时需要再次传递已有的关联。
这意味着您必须在更新记录时始终包含 HABTM 数据。否则,这些记录将被删除,并根据通过的内容进行更新。
现在,您可以创建的最基本的友谊设置将涉及两个表。
CREATE TABLE `users` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(45) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `users_users` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(10) unsigned NOT NULL,
`friend_id` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `user` (`user_id`),
KEY `friend` (`friend_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
第一个表'users'将保存我们的用户数据,第二个'users_users'是HABTM连接表。请注意名称,它是 users_users 因为它自己加入。
您仍然需要在 CakePHP 中创建两个模型。
第一个是 User.php,它将描述系统中的用户。我们将主要使用 CakePHP 中的默认值来使其工作。因此,HABTM 只是一行“朋友”。
class User extends AppModel
{
var $name = 'User';
var $hasAndBelongsToMany = array(
'Friend'
);
}
现在,CakePHP 会抱怨表 users_friends 丢失了。我们需要创建一个 Friend 模型,但将其指向 users 表。
class Friend extends AppModel
{
var $name = 'Friend';
var $useTable = 'users';
}
现在 CakePHP 将使用 users_users 表作为连接。Friend 模型现在描述了作为朋友的用户。
重要的是要了解您必须在两个方向上创建朋友。当您为用户 A 保存数据时说他/她是用户 B 的朋友,那么您还必须保存用户 B 并说他/她是用户 A 的朋友。否则,只有一个用户将定义好友关系。
这里还有另一个答案,它使用别名定义了友谊的双重方向,但我建议不要实现它,因为它为 CakePHP 增加了您的应用程序可能不需要的额外 SQL 查询工作。当您阅读用户 A 的记录时,您只需要知道他们的朋友是谁,反之则不需要。
您可以创建一个行为,以确保在更新用户记录时友谊是双向的。那会更有效率。
注意:我的代码示例适用于我目前正在使用的 CakePHP 1.3 ,但它在 2.x 中应该可以正常工作。