2016-05-25 8 views
2

ORMを使用して挿入/永続操作が成功した後、Doctrineはエンティティのidプロパティをどのように設定しますか?

$timer = new Timer(); //an object marked as a Doctrine Entity 
$this->em->persist($timer); 
print $timer->getId(); //blank - not yet set 
$this->em->flush($timer); 
print $timer->getId(); //prints ID of newly inserted record 

実際のORMコード(教義)

public function persist($entity) 
{ 
    if (! is_object($entity)) { 
     throw ORMInvalidArgumentException::invalidObject('EntityManager#persist()' , $entity); 
    } 

    $this->errorIfClosed(); 

    $this->unitOfWork->persist($entity); 
} 

質問 ORMのコードは、上記の持っているときDoctrineは、Entityinsert_idを挿入しない方法

「参照渡し」指令はありませんか?

I.e.エンティティはpersistプロセス中(insert_idで)変更されることを示すために

public function persist(&$entity) 
{ 
    ... 
} 

:通常私はこのような何かを期待したいです。しかし、この種のものはありません。それにもかかわらず、Entityにはinsert_idが魔法のように設定されています。

これはどのように起こりますか?

答えて

0

オブジェクトは参照渡し(および割り当て)されます。オペレータの住所を使用する必要はありません。

よく言及されるPHP 5の主なポイントの1つは、「オブジェクトはデフォルトで参照によって渡されます」ということです。これは完全に真実ではありません。このセクションでは、一般的な考え方をいくつかの例を用いて整理します。

PHPリファレンスは別名で、2つの異なる変数で同じ値を書き込むことができます。 PHP 5以降、オブジェクト変数にはオブジェクト自体が値として含まれていません。これには、オブジェクトアクセサが実際のオブジェクトを見つけることを可能にするオブジェクト識別子のみが含まれています。オブジェクトが引数で送られたり返されたり、別の変数に代入されたりすると、異なる変数は別名ではなく、同じオブジェクトを指す識別子のコピーを保持します。

PHP documentation

IdはUnitOfWork::executeInsertsに設定してください。

$postInsertIds = $persister->executeInserts(); 
    if ($postInsertIds) { 
     // Persister returned post-insert IDs 
     foreach ($postInsertIds as $postInsertId) { 
      $id  = $postInsertId['generatedId']; 
      $entity = $postInsertId['entity']; 
      $oid  = spl_object_hash($entity); 
      $idField = $class->identifier[0]; 
      $class->reflFields[$idField]->setValue($entity, $id); 
関連する問題