2014-10-01 194 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