嘿所有我希望有人有足够的经验使用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
,但我正在努力学习。
答案 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)。假设您已正确设置关系,那么您需要做的是进行两级递归查找,以便您找到的朋友检索他们的所有朋友,并且这些朋友会加载他们的提示。您可能必须动态绑定/取消绑定模型以防止这些朋友获取他们的朋友(尽管实际上这可能不是太大的问题)。