2016-05-25 6 views
2

ORMWie füllt Doctrine ID-Eigenschaft einer Entität nach erfolgreicher Einfüge-/Persist-Operation?

$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 

Actual ORM-Code (Lehre)

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

    $this->errorIfClosed(); 

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

Frage

Wie Lehre insert_id in die Entity einfügt, wenn der Code über ORM hat keine "by reference" -Richtlinie?

I.e. Ich würde normalerweise so etwas wie dies erwartet:

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

um anzuzeigen, dass das Unternehmen (mit insert_id) während des persist Prozesses geändert werden. Aber es gibt nichts dergleichen. Dennoch ist Entity mit insert_id magisch bevölkert.

Wie genau passiert das?

Antwort

0

Objekte werden als Referenz übergeben (und zugewiesen). Keine Notwendigkeit, die Adresse des Betreibers zu verwenden.

Einer der Schlüsselpunkte von PHP 5 OOP, der oft erwähnt wird, ist, dass "Objekte standardmäßig von Referenzen übergeben werden". Dies ist nicht vollständig richtig. Dieser Abschnitt korrigiert diesen allgemeinen Gedanken anhand einiger Beispiele.

Eine PHP-Referenz ist ein Alias, mit dem zwei verschiedene Variablen auf denselben Wert schreiben können. Ab PHP 5 enthält eine Objektvariable das Objekt selbst nicht mehr als Wert. Es enthält nur einen Objektbezeichner, mit dem Objektaccessoren das tatsächliche Objekt finden können. Wenn ein Objekt über ein Argument gesendet, zurückgegeben oder einer anderen Variablen zugewiesen wird, sind die verschiedenen Variablen keine Aliasnamen: Sie enthalten eine Kopie des Bezeichners, der auf dasselbe Objekt verweist.

PHP documentation

Id Satz in 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); 
Verwandte Themen