2016-11-14 3 views
0

В моем Symfony3 проекта, у меня есть некоторые документы, такие как пользователя, описанные ниже:Получить идентификатор документа MongoDB, созданный в хранилище Symfony3

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, я хотел бы вернуть идентификатор документа я только что создали.

В поисках ответов, я нашел этот кусок кода:

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

К сожалению, это не возвращает то, что я ищу:

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

Спасибо за вашу помощь!

EDIT:

Вот обновленный код с предложением в принятом ответе:

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 записывает идентификатор в массив, который проходит, но вы не видя его из-за структуры объектов запроса. Вы можете получить его из объекта запроса, который возвращается getQuery():

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

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

Заметим, однако, что это не обязательно будет работать в будущих версиях, так как новый драйвер MongoDB (который будет использоваться, начиная с ODM 2.0) не имеет этой функции.