如何在不使用`$ this-> Model-> query()`的情况下在CakePHP中编写复杂的查找查询?

时间:2008-10-13 01:42:18

标签: php mysql cakephp

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

我正在研究一些可能被亲切地称为推特克隆的东西。基本上我有这样的设置。

用户有很多朋友。这是与用户表的多对多关系。它存储在名为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

返回用户#2s提示以及作为用户2的朋友的任何人的提示。

现在我怎样才能使用$this->Tip->findxxxxx(user_id)

做同样的事情

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

3 个答案:

答案 0 :(得分: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”模型上的第一个查找,CakePHP使用该模型来建模您的HABTM friends_users表,因此您无需创建它。

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

答案 1 :(得分:1)

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

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

希望这会有所帮助。

答案 2 :(得分:0)

在CakePHP中,很多人都说“拥有并属于许多人”(HABTM)。假设您已正确设置关系,那么您需要做的是进行两级递归查找,以便您找到的朋友检索他们的所有朋友,并且这些朋友会加载他们的提示。您可能必须动态绑定/取消绑定模型以防止这些朋友获取他们的朋友(尽管实际上这可能不是太大的问题)。

必须阅读manual entry on associations