代码之家  ›  专栏  ›  技术社区  ›  JoshReedSchramm

如果不使用“$this->Model->query()”,如何在CakePHP中编写复杂的查找查询?

  •  0
  • JoshReedSchramm  · 技术社区  · 17 年前

    嘿,我希望有人有足够的经验与蛋糕PHP使这项工作。

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

    用户有很多朋友。这是与用户表的多对多关系。它存储在一个名为friends\u users的链接表中,该链接表具有user\u id、friend\u id列。users是一个具有user\u id列的表。

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

    我想找出一种方法来查找Tip模型,该模型返回我传入的用户ID拥有的所有Tip以及该用户的任何朋友拥有的任何Tip。

    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
    

    它返回用户2的提示以及用户2的朋友的提示。

    现在,我如何使用 $this->Tip->findxxxxx(user_id)

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

    3 回复  |  直到 13 年前
        1
  •  3
  •   neilcrookes    17 年前

    如果查询结果中只需要一个提示列表,我会尝试在两个查询中完成这项工作。第一个用于查找此用户及其朋友的用户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表进行建模,因此无需创建它。

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

        2
  •  1
  •   rees    15 年前

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

    希望这有帮助。

        3
  •  0
  •   Edward Z. Yang    17 年前

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

    manual entry on associations 这是一本必读的书。

    推荐文章