0

嘿,我希望有人对 Cake PHP 有足够的经验来完成这项工作。

我正在做一些目前可以被亲切地称为 twitter 克隆的东西。基本上我有这样的设置。

用户有很多朋友。这是与用户表的多对多关系。它存储在名为friends_users 的链接表中,列有user_id、friend_id。用户是一个包含 user_id 列的表。

然后我有一个与用户相关联的名为tips 的表。一个用户可以有很多提示。

我想找到一种在 Tip 模型上进行查找的方法,该模型返回我传入的用户 ID 拥有的所有提示以及该用户的任何朋友拥有的任何提示。

此 SQL 查询完美运行 -

SELECT *
FROM `tips`
JOIN users ON users.id = tips.user_id
JOIN friends_users ON tips.user_id = friends_users.friend_id
WHERE (friends_users.user_id =2 or tips.user_id=2)
LIMIT 0 , 30

这将返回 user#2s Tips 以及 User 2 的朋友的任何人的tips。

现在我怎么能做同样的事情使用$this->Tip->findxxxxx(user_id)

我知道Tip->query如果需要我可以使用,但我正在努力学习。

4

3 回答 3

3

如果您在查询结果中只需要一个提示列表,我很想在 2 个查询中执行此操作。第一个查找此用户及其朋友的用户 ID 列表,第二个查找属于这些 ID 中的任何一个的提示。因此,在您的 Tip 模型中:

function findTipsByUserAndFriends($userId) {
  //FriendsUser is automagically created by CakePHP "with" association
  $conditions = array('FriendsUser.user_id'=>$userId);
  $fields = 'FriendsUser.friend_id';
  //get a list friend ids for the given user
  $friendIds = $this->Tip->User->FriendsUser->find('list', compact('conditions', 'fields'));
  //get list of all userIds for whom you want the tips
  $userIds = array($userId) + $friendIds;
  $conditions = array('Tip.user_id'=>$userIds);
  $tips = $this->Tip->find('all', compact('conditions'));
  return $tips;
}

请注意,您调用的是自动创建的“FriendsUser”模型上的第一个 find,CakePHP 使用该模型对您的 HABTM friends_users 表进行建模,因此您不需要创建它。

这是未经测试的,因此您可能需要调试其中的一些,但您明白了。

于 2008-10-13T08:52:30.437 回答
1

我建议您使用可包含的,它效果很好。

$aCond = array(
            'fields' => array(
                'Discount.*'
            ),
            'contain' => array(
                'Event' => array(
                    'conditions' => array('Event.id' => $iEventId)
                )
            )
        );
$aBulkDiscounts = $this->Discount->find('first', $aCond);

希望这可以帮助。

于 2011-07-15T09:55:50.823 回答
0

在 CakePHP 中,多对多是“Has And Belongs To Many”(HABTM)。假设您已经正确设置了关系,那么您需要做的是进行两级递归查找,这样您找到的朋友会检索他们的所有朋友,并且这些朋友会加载他们的提示。您可能必须动态绑定/取消绑定模型以防止这些朋友获得他们的朋友(尽管在实践中这可能不是太大的问题)。

必须阅读有关关联的手动条目。

于 2008-10-13T01:50:09.413 回答