2014-10-01 90 views
0

我正在使用MongoDB GridFS存储用户头像。我正在使用Laravel 4.2。MongoDB GridFS获取文件ID

我正在写一个函数来清理任何未使用的头像的数据库; 如果某个头像的id与任何用户(用户模型)都没有关联,则该头像未被使用。鉴于化身的ID,我可以从数据库中删除该文件。但是,我无法提取化身的ID,所以我可以将其与User模型中的化身进行比较。

的数据是这样的:

$avatars = DB::collection('user_avatars.files')->get(); 
    return Response::json($avatars[0]); 

    //result: 
    {"_id":{"$id":"542797096a8d09ac318b456b"},"extension":"jpg","usage":0,"popularity":[],"filename":"image.jpg","uploadDate":{"sec":1411880713,"usec":671000},"length":248388,"chunkSize":262144,"md5":"2c724361015c7e438d30359dd9c724a0"} 

现在,如果我写的:

return Response::json($avatars[0]['_id']); 

    //result is: 
    {"$id":"542797096a8d09ac318b456b"} 

我怎么会抢542797096a8d09ac318b456b?什么是我迄今试图不给的ID,但将引发一个错误:

$avatars[0]['_id']->$id; 
$avatars[0]['_id']['$id']; 
$avatars[0]['_id']->$$id; 
$avatars[0]['_id']->{$id}; 

回答

1

我想这和它的伟大工程:

avatars[0]['_id']->{'$id'}; 

这里完整的功能:

public function doPurgeDB() 
{ 
    $removed = array(); 
    $avatars = DB::collection('user_avatars.files')->get(); 
    foreach($avatars as $avatar) 
    { 
     $avatar_id = $avatar['_id']->{'$id'}; //<<<<========= 
     $user = User::where('avatar_id', '=', $avatar_id); 
     if(!$user->count()) 
     { 
      $removed[] = $avatar; 
      $this->removeAvatar($avatar_id); 
     } 
    } 
    return Response::json($removed); 
} 

public function removeAvatar($id) 
{ 
    $grid = DB::getGridFS('user_avatars'); 
    return $grid->delete(new MongoId($id)); 
} 
+0

虽然[一行答案](http://meta.stackoverflow.com/questions/266954/one-line-answers)是可以接受的,但它们通常会导致答案被路由到Review Queue(* q.v. *)。另外,有时他们不被社区所接受。通常提供一个简单的解释是一个好主意。 – jww 2014-10-02 00:40:18

+0

你是对的。然而,有些问题非常具体,以致需要“单线答案”。为这些问题提供更多的线路将会产生反作用。如果我对这个答案的工作原理有了一些解释,我会把它包括进来......实际上我会自己去找出它,因为它可能无疑会帮助其他人,但我很高兴我有一个解决方案,我可以继续在我的项目上工作。 – PeterKA 2014-10-02 01:36:29

0

将它转换为字符串:(string)$avatars[0]['_id'];

+0

非常感谢您的回答@chianh。我相信这会起作用。 – PeterKA 2014-10-03 05:56:37