【问题标题】:CakePHP Twitter-clone: Can't get follow-system to workCakePHP Twitter-clone:无法让跟随系统工作
【发布时间】:2011-10-07 03:17:16
【问题描述】:

抱歉,标题不详,但我不知道如何措辞。目前,我正在尝试使用 cakePHP 开发 Twitter 克隆,因为我是 Web 编程新手。我用了 3 张桌子:

用户(ID、姓名)

  • id是自动生成的id
  • 用户名

推文(id、内容、user_id)

  • id是自动生成的id
  • 内容是推文的文本
  • user_id 是发帖的用户 ID

关注者(id、user_id、following_id)

  • id是自动生成的id
  • user_id 是执行以下操作的用户
  • following_id 是被关注的用户

现在,几乎所有东西都基本正常工作了,甚至有点关注功能。但是,我想我可能错误地设置了模型关系。事实上,我很确定这是错的。

现在,这些是模型关系:

  • 用户:有很多推文,有很多关注者
  • 推文:属于用户
  • 关注者:属于用户

我很确定追随者关系是错误的,但这就是我一直在处理的问题。现在,有效的是用户登录/注销、会话、发布、删除您自己的帖子以及关注其他用途(然后能够看到他们的推文)。

当我尝试获取我正在关注的人或正在关注我的人的列表时,现在不起作用的是。问题是我不确定如何访问这些数据。

我想要一个屏幕,我可以在其中单击链接以查看我正在关注的所有人,然后查看他们所有的最新推文。

例如,我相信我可以使用 find() 查询来获取我关注的所有人的列表,但正如您从上面的 Follower 表中看到的那样,该查询仅返回用户 ID追随者和被追随者。从这些数据中,我如何获得他们的姓名和最新推文?

我要进行两次查找吗?我可以在我的模型关系中重新定义它吗,以便在我的 ctp 文件中,我可以通过 php 浏览并使用类似的东西:

$this->$data['Tweet']['userID']
$this->$data['User']['name']
$this->$data['Tweet']['content']

对不起,我不确定我的解释是否正确......

不过,我确实希望我的意图很明确。任何建议表示赞赏!

谢谢!

【问题讨论】:

  • 我认为您应该使用HABTM 与关注者的关系,另请参阅book.cakephp.org/view/1046/Multiple-relations-to-the-same-model 以讨论将模型与其自身关联。
  • 我问了我的一个朋友对此的看法(因为他是一名网络开发人员),他说我不一定需要处理表关系。他说在 cake 中应该有某种方法可以通过一个查询访问这些数据,但我相信他的意思只是对两个数据集进行简单的 find 查询。除非我在这里缺少某些东西,否则我以某种方式认为您提出的方式更有意义...
  • 是的,除非我完全误解了这个问题,如果您建立了 HABTM 关系,您可以通过一个查询获得所需的一切。
  • 我不认为你误解了这个问题。但是,也许我需要澄清一些事情。如果我与追随者建立了HABTM关系,那我不会有4张桌子吗?用户(id,姓名),推文(id,内容,user_id),关注者(id),Users_Followers(user_id,following_id)?也许这就是我需要重新阅读与您建议的同一模型链接的关系的地方,因为这对我来说看起来不正确..:)
  • 不,您不需要关注者表,因为用户表将与其自身相关联。

标签: php cakephp twitter


【解决方案1】:
app/models/user.php

class User extends AppModel{
      var $name = 'User';

      var $hasAndBelongsToMany = array(
            'Follower' => array(
                  'className'             => 'Follower',
                  'joinTable'             => 'user_users',
                  'foreignKey'            => 'user_id',
                  'associationForeignKey' => 'child_user_id'
            )
      )
}

app/models/follower.php

class Follower extends AppModel{
      var $name     = 'Follower';
      var $useTable = 'users';
}

您必须使用字段 user_id 和 child_user_id 创建一个表 user_users。 child_user_id 将是追随者 ID,您可以根据需要将其命名为追随者 ID,但如果您将来需要建立类似的关系,可能会造成混淆。

试试看。

【讨论】:

  • 我认为他不需要一个新表,他的followers连接表(它应该连接两个不同的用户模型实例)。跨度>
  • 是的,但他应该摆脱该关注者表并创建一个 user_users 表。如果你想在未来做同样的关系,那就更有意义了。例如,对于订阅者或朋友,如果他将其放在关注者中会完全混淆,如果他为它创建一个新表,那就更糟了。
  • 谢谢!但这是否意味着我不需要 user_users 表的模型?
  • 您的关注者模型是 user_users 模型,因为它使用该表。
  • 谢谢,但即使使用这种新方法,我也不确定我的 find() 查询应该是什么样子。例如,我想我想按照“选择 user_id = 1 所关注的所有用户”的行来运行查询。但是,我不需要一个接一个地查询两个表吗?第一个查询将在 Follower 表上查找所有 ID,然后第二个查询通过用户运行以查找相关信息,例如名称。是否有某种方法可以在 users 表上运行单个查询以获取特定 ID 关注的所有人(以及他们的用户名等)?
猜你喜欢
  • 1970-01-01
  • 2014-03-03
  • 2015-09-08
  • 2017-12-12
  • 2010-12-19
  • 2013-09-10
  • 2019-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多