2016-11-14 62 views
0

在我Symfony3項目,我確實有一些文件,如用戶,說明如下:獲取在Symfony3庫中創建MongoDB的文檔的ID

UserBundle\Document\User: 
    repositoryClass: UserBundle\Repository\UserRepository 
    fields: 
     userId: 
      id: true 
     email: 
      type: string 
     firstName: 
      type: string 
     lastName: 
      type: string 

一段時間,我想創建一個用戶文檔通過用戶存儲庫。 圍繞createQueryBuilder()工作,我已經建立了這個方法:

public function insert($email, $firstName, $lastName) 
{ 
    $data = array('email' => $email, 
     'firstName' => $firstName, 
     'lastName' => $lastName, 
    ); 

    /* Create query */ 

    $query = $this->createQueryBuilder(); 

    /* Add Data */ 

    $query 
     ->insert() 
     ->setNewObj($data); 

    /* Return */ 

    $query 
     ->getQuery() 
     ->execute(); 

    return true; 
} 

而不是返回true,我想回到我剛剛創建文件的ID。

爲了尋找答案,我發現這段代碼:

$this->getDocumentManager()->getConnection()->lastInsertId 

不幸的是,它沒有返回我所期待的:

object(MongoDB)[307] 
    public 'w' => int 1 
    public 'wtimeout' => int 10000 

感謝您的幫助!

編輯:

這裏是在接受的答案提出的建議更新代碼:

public function insert($email, $firstName, $lastName) 
{ 
    $id = new MongoId(); 

    $data = array(
     '_id' => $id, 
     'email' => $email, 
     'firstName' => $firstName, 
     'lastName' => $lastName, 
    ); 

    /* Create query */ 

    $query = $this->createQueryBuilder(); 

    /* Add Data */ 

    $query 
     ->insert() 
     ->setNewObj($data); 

    /* Return */ 

    $query 
     ->getQuery() 
     ->execute(); 

    return $id->__toString(); 
} 

回答

1

爲您解決問題最簡單的方法是產生標識符前期通過調用new \MongoId(),將它添加添加到您要插入的數據(在_id密鑰下)並返回已知值。這也正是MongoDB驅動程序在幕後插入沒有明確設置標識符的文檔時所做的事情(請參閱this doc example

0

MongoDB驅動程序將ID寫入正在傳入的數組中,但是您沒有看到它由於查詢對象的結構。您可以從由getQuery()返回的查詢對象得到它:

$query = $queryBuider->getQuery(); 
$query->execute(); 

$id = $query->getQuery['newObj']['_id']; 

不過請注意,這不會在將來的版本一定的工作,因爲新的MongoDB驅動程序(將用於開始ODM 2.0)沒有這個功能。