处理控制器中查找操作的内爆值

时间:2012-05-01 18:06:47

标签: mysql arrays cakephp cakephp-1.3

我相信这里有人可以帮助我。首先介绍一下我正在做的事情。我基本上建立了一个社交网站,为了便于理解,基本上称之为模仿每个人最喜欢的Facebook。

目前一切正常,除了一件事。有一点是在“墙上”显示我所有的朋友帖子。我可以收到我的帖子,我也可以从我要求的朋友和那些要求我的朋友那里获得ID最低的人的帖子。

例如,假设我是用户A,有用户B,用户C,用户D和用户E.我登录并请求用户B和用户C,他们都同意。我们假设用户D和用户E请求我,我同意他们两个。所以现在我(用户A)是用户B,C,D和E的朋友。我要求B和C,D和E请求我。为了这个例子,让我们假设这些用户的ID按顺序排列; 1是我(A),5是E。

当“墙”填充时,我会收到我应该预料到的帖子,但我只收到用户B(我要求)和用户D(要求我)的帖子。用户的C和E的帖子没有显示,因为他们的ID是在B和D之后......

现在代码......涉及的模型是User,Friendship和WallPost。我的users_controller在profile()函数中有以下查找操作。

   $friends_to = $this->Friendship->find('all', array(
          'conditions' => array('Friendship.pending' => 1, 'Friendship.approved' => 1, 'UserTo.id' => $id),
          'fields' => array('Friendship.user_from')
        )
    );  
    $friends_to_ids = implode(',', Set::extract($friends_to, '{n}.Friendship.user_from'));

    $friends_from = $this->Friendship->find('all', array(
          'conditions' => array('Friendship.pending' => 1, 'Friendship.approved' => 1, 'UserFrom.id' => $id),
          'fields' => array('Friendship.user_to')
        )
    );
    $friends_from_ids = implode(',', Set::extract($friends_from, '{n}.Friendship.user_to'));

    $post_conditions =  array(
        'OR' => array(
            array('WallPost.user_id' => $this->Auth->user('id')),
            array('WallPost.user_id' => $friends_to_ids),
            array('WallPost.user_id' => $friends_from_ids)
        ),
    );
    $posts = $this->WallPost->find('all', array(
          'conditions' => $post_conditions,
          'order' => array('WallPost.created' => 'desc')
        )
    );
    $this -> set ('posts', $posts);

在上面给出的示例的上下文中,这将返回以下SQL语句:

SELECT `WallPost`.`id`, `WallPost`.`user_id`, `WallPost`.`content`, `WallPost`.`created`, `WallPost`.`modified`, `User`.`id`, `User`.`first_name`, `User`.`last_name`, `User`.`username`, `User`.`password`, `User`.`email`, `User`.`group_id`, `User`.`confirmed`, `User`.`confirm_code`, `User`.`created`, `User`.`modified` FROM `wall_posts` AS `WallPost` LEFT JOIN `users` AS `User` ON (`WallPost`.`user_id` = `User`.`id`) WHERE ((`WallPost`.`user_id` = 1) OR (`WallPost`.`user_id` = '2,3') OR (`WallPost`.`user_id` = '4,5')) ORDER BY `WallPost`.`created` desc

所以ID在那里,但只显示以下内容。 (WallPostuser_id = 1),ID为1的用户。(WallPostuser_id ='2,3'),仅显示用户ID 2。 (WallPostuser_id ='4,5'),仅显示用户ID。

我在这里做错了什么?为什么不显示所有这些用户的结果?任何向正确方向的推动都将非常感激。

快速更新:我重构了我的查询,所以它有点不同但返回相同的东西。

SELECT `WallPost`.`id`, `WallPost`.`user_id`, `WallPost`.`content`, `WallPost`.`created`, `WallPost`.`modified`, `User`.`id`, `User`.`first_name`, `User`.`last_name`, `User`.`username`, `User`.`password`, `User`.`email`, `User`.`group_id`, `User`.`confirmed`, `User`.`confirm_code`, `User`.`created`, `User`.`modified` FROM `wall_posts` AS `WallPost` LEFT JOIN `users` AS `User` ON (`WallPost`.`user_id` = `User`.`id`) WHERE `WallPost`.`user_id` IN (1, '2,3', '4,5') ORDER BY `WallPost`.`created` desc

经过一番研究后,看起来好像它正在查看'2,3'和'4,5'作为字符串,它应该将它们视为IN(1,2,3,4,5) 。我怎么能解决这个问题是没有找到我,再次感谢任何帮助。

感谢帮助人员,这是正确的答案。现在这是我关于这个问题的下一个小问题。

因此,从数据库中提取的内容是针对3个内容,我的用户ID以及包含请求和已批准的朋友ID以及已请求并已获得我批准的朋友的ID的2个数组进行查询。使用下面解决方案中给出的相同技术,我现在有了。

$friends_tos = $this->Friendship->find('all', array(
          'conditions' => array('Friendship.pending' => 1, 'Friendship.approved' => 1, 'UserTo.id' => $id),
          'fields' => array('Friendship.user_from'), //array of field names
        )
    );  
    $friends_to_ids = Set::extract($friends_tos, '{n}.Friendship.user_from');

    $friends_froms = $this->Friendship->find('all', array(
          'conditions' => array('Friendship.pending' => 1, 'Friendship.approved' => 1, 'UserFrom.id' => $id),
          'fields' => array('Friendship.user_to'), //array of field names
        )
    );
    $friends_from_ids = Set::extract($friends_froms, '{n}.Friendship.user_to');

给我$ friends_to_ids =(2,3)和$ friends_from)ids =(4,5),然后我使用以下$aMerge = array_merge($friends_to_ids, $friends_from_ids);来组合它们,这给了我$ aMerge =(2,3, 4,5),这很棒。

然而,将此作为我的查找条件:

$post_conditions =  array(
        'OR' => array(
            'WallPost.user_id' => $this->Auth->user('id'),
            'WallPost.user_id' => $aMerge
        ),
    );

仅返回$ aMerge的值,并完全跳过我的用户ID的值。我已经尝试了多种重组这种查找条件的方法,但无济于事。我确定我错过了一些小东西,因为它通常是这样,但我画的是空白......

确保你回答我可以标记的地方......

1 个答案:

答案 0 :(得分:0)

好吧也许这不是最干净的方式,但我有一个想法,尝试过它并且有效。如果有人有一个更简单,更清洁的解决方案,我将非常感谢它知道它是什么。

所以这就是我所做的。按照与找到我自己的朋友相同的流程,使用查找'all'并将返回限制为1.然后以数组的形式提取该ID,即使它是单个值。

$me = $this->User->find('all', array(
          'conditions' => array('User.id' => $this->Auth->user('id')),
          'fields' => array('User.id'),
          'limit' => 1,
        )
    );
    $my_id = Set::extract($me, '{n}.User.id');

然后我将它添加到array_merge:

$aMerge = array_merge($my_id, $friends_to_ids, $friends_from_ids);

然后当使用$ aMerge作为我的“墙”帖子的查找条件时,我得到了返回(1,2,3,4,5),这正是我所需要的。再次请求帮助并提出您的答案,以便我能给予您信任......