ここの誰かが私を助けることができると確信しています。まず、私がしていることについて少し背景を説明します。私は基本的にソーシャルネットワーキングサイトを構築しています。簡単に理解できるように、基本的にはみんなのお気に入りのFacebookのモックと呼んでいます。
現在、1つを除いて、すべてが正常に機能しています。その1つは、友達の投稿をすべて「壁」に表示することです。自分の投稿を取得できます。また、リクエストした友達とリクエストした友達の両方から、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(要求した)からの投稿しか取得できません。ユーザーのIDはBとDの後にあるため、ユーザーのCとEの投稿は表示されません...
コードに移りましょう...関係するモデルは、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はそこにありますが、以下を表示するだけです。(WallPost
。user_id
= 1)、IDが1のユーザー(WallPost
。user_id
= '2,3')、ユーザーID2のみが表示されます。(WallPost
。user_id
= '4,5')、ユーザーID4のみが表示されます。
私はここで何が間違っているのですか?これらすべてのユーザーの結果が表示されないのはなぜですか?正しい方向へのプッシュは大歓迎です。
クイックアップデート:クエリを再構築したため、少し異なりますが、同じものが返されます。
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)として表示する必要があるのに、文字列として表示しているように見えます。これを修正する方法がわからないので、助けていただければ幸いです。
正解だった助けてくれてありがとう。これが、この問題に関する私の次の小さな問題です。
したがって、DBから取得されたものは、ユーザーIDと、要求および承認された友人IDと私によって要求および承認された友人のIDを含む2つの配列の3つに対して照会されます。以下の解決策で与えられたのと同じテクニックを使用して、私は今持っています。
$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の値を完全にスキップします。私はこの検索条件を再構築する複数の方法を試しましたが、役に立ちませんでした。いつものように小さなものが欠けていると思いますが、空白を描いています...
私がそれをマークできるところにあなたが答えることを確認してください...