开发者

How do I use the result from FB FQL multiquery?

开发者 https://www.devze.com 2023-03-15 04:49 出处:网络
I\'m confused by Facebook\'s fql.multiquery method. I\'m trying to retrieve all the comments on a post, and then the user information for each one as well.I can get the comments without any problem,

I'm confused by Facebook's fql.multiquery method.

I'm trying to retrieve all the comments on a post, and then the user information for each one as well. I can get the comments without any problem, but I'm having trouble getting the users.

Currently I'm using the following:

  FB.api({
   method: 'fql.multiquery',
   queries: {
    query1: 'SELECT post_fbid, fromid, text, time FROM comment WHERE post_id="'+postID +'"',
    query2: 'SELECT id, name, url, pic FROM profile WHERE id IN (SELECT fromid FROM #query1)'
   }
  },
  function(response) {
  }
})

This gives me the following response:

[
  {
    "name": "query1",
    "fql_result_set": [
      {
        "post_fbid": "xxxxx",
        "fromid": user1id,
        "text": "Here's a comment",
        "time": 1308579931
      },
      {
        "post_fbid": "xxxxx",
        "fromid": user2id,
        "text": "Another commen开发者_开发知识库t",
        "time": 1308580031
      }
    ]
  },
  {
    "name": "query2",
    "fql_result_set": [
      {
        "id": user1id,
        "name": "User 1 name",
        "url": "User 1 url",
        "pic": "User 1 pic"
      },
      {
        "id": user2id,
        "name": "User 2 name",
        "url": "User 2 url",
        "pic": "User 2 pic"
      }
    ]
  }
]

Problem is, I don't know how to match these up! So I'm looping over the comments, and want to print the text of each one with the user's name next to it. How do I do that?

Or, is there a better way to do this?


You could match these results up by looping over the comments and matching the fromid to an id from the users response.

For example:

    var comments = response[0].fql_result_set;
    var users = response[1].fql_result_set;    

    //loop through the comments
    for(var i = 0, j = comments.length; i<j; i++){

        for(var x = 0, y = users.length; x<y; x++){
             if(comments[i].fromid == users[x].id){
                 //we have a match, this comment is from user users[x]
                 //process users[x]
                 //break the inner for loop, since we already have a match
             }
        }

    }


If you're working with PHP and need a single array of comments to loop through this function might come in handy:

public function getComments($objectID){
    $user = $comment =array();
    $q1 = "/fql?q=".urlencode("SELECT  id, fromid, text, time , likes FROM comment WHERE object_id ='$objectID' ");
    $res = $this->api($q1);
    $com = $res['data'];

    $q2 = "/fql?q=".urlencode("SELECT uid, name, username, pic_small, current_location FROM user WHERE uid IN (SELECT fromid FROM comment WHERE object_id ='$objectID' )");
    $res = $this->api($q2);
    $usr = $res['data']; 

    foreach($usr as $k=>$v){
        $user[$v['uid']] = $v;
    }
    foreach($com as $cmnt){
        $comment[$cmnt['id']] = $cmnt;
        $comment[$cmnt['id']]['user'] = $user[$cmnt['fromid']];
    }
     return $comment;
}

Returns a single array of comments with the commentID as key:

Array(

[137194739772009_249649] => Array
    (
        [id] => 137194739772009_249649
        [fromid] => 1454592211
        [text] => Brilliant!
        [time] => 1357450854
        [likes] => 1
        [user] => Array
            (
                [uid] => 1454592211
                [name] => Jo Payne
                [username] => jo.payne.127
                [pic_small] => http://profile.ak.fbcdn.net/hprofile-ak-snc6/203035_1454592211_505092710_t.jpg
                [current_location] => Array
                    (
                        [city] => Pascoe Vale
                        [state] => Victoria
                        [country] => Australia
                        [zip] => 
                        [id] => 107340732634422
                        [name] => Pascoe Vale, Victoria, Australia
                    )

            )

    )

[137194739772009_252711] => Array
    (
        [id] => 137194739772009_252711
        [fromid] => 1734247348
        [text] => testing
        [time] => 1357531321
        [likes] => 0
        [user] => Array
            (
                [uid] => 1734247348
                [name] => Andreas Lustig
                [username] => andreaslustigcom
                [pic_small] => http://profile.ak.fbcdn.net/hprofile-ak-snc6/275058_1734247348_2025403101_t.jpg
                [current_location] => Array
                    (
                        [city] => Melbourne
                        [state] => Victoria
                        [country] => Australia
                        [zip] => 
                        [id] => 116190411724975
                        [name] => Melbourne, Victoria, Australia
                    )

            )

    )

)
0

精彩评论

暂无评论...
验证码 换一张
取 消