I use "notify" as the change tracking policy. Is it sufficient to call 
onPropertyChanged() on the the owning side of the association, because this 
is actually related to a database column? Or do I have to call 
onPropertyChanged() on both sides? Here is my example code:
<?php
declare(encoding='UTF-8');

namespace MyCompany\MyBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * @ORM\Entity
 * @ORM\ChangeTrackingPolicy( "NOTIFY" )
 * @ORM\Table( name = "person" )
 */
class Person extends Entity  {

  public function __construct() {
    parent::__construct();
    $this->id = null;
    $this->postalAddresses = new ArrayCollection();
  }

  public function addPostalAddress( PostalAddress $postalAddress = null ) {
    if( is_null( $postalAddress ) ) return $this;
    if( $this->postalAddresses->contains( $postalAddress ) ) return $this;
    $oldPostalAddresses = $this->postalAddresses;
    $newPostalAddresses = clone( $oldPostalAddresses );
    $newPostalAddresses->add( $postalAddress );
    $this->postalAddresses = $newPostalAddresses;
    $this->onPropertyChanged( 'postalAddresses', $oldPostalAddresses, 
$newPostalAddresses );
    $postalAddress->setPerson( $this );
    return $this;
  }

  public function removePostalAddress( PostalAddress $postalAddress = null, 
Person $newPerson = null ) {
    if( is_null( $postalAddress ) ) return $this;
    if( !( $this->postalAddresses->contains( $postalAddress ) ) ) return 
$this;
    if( $newPerson == $this ) return $this;
    $oldPostalAddresses = $this->postalAddresses;
    $newPostalAddresses = clone( $oldPostalAddresses );
    $newPostalAddresses->removeElement( $postalAddress );
    $this->postalAddresses = $newPostalAddresses;
    $this->onPropertyChanged( 'postalAddresses', $oldPostalAddresses, 
$newPostalAddresses );
    $postalAddress->setPerson( $newPerson );
    return $this;
  }

  /**
   * @ORM\Id
   * @ORM\Column( name = "id", type = "integer" )
   * @ORM\GeneratedValue( strategy = "SEQUENCE" )
   * @var int
   */
  protected $id = null;

  /**
   * @ORM\OneToMany( targetEntity = "PostalAddress", mappedBy = "person" )
   * @var Doctrine\Common\Collections\ArrayCollection
   */
  protected $postalAddresses = null;
}


/**
 * @ORM\Entity
 * @ORM\ChangeTrackingPolicy( "NOTIFY" )
 * @ORM\Table( name = "postal_address" )
 */
class PostalAddress extends Entity  {

  public function __construct( Person $person ) {
    parent::__construct();
    $this->id = null;
    $this->setPerson( $person );
  }

  public function setPerson( Person $newPerson = null ) {
    if( $this->person == $newPerson ) return $this;
    $oldPerson = $this->person;
    $this->person = $newPerson;
    $this->onPropertyChanged( 'person', $oldPerson, $newPerson );
    if( !is_null( $oldPerson ) ) $oldPerson->removePostalAddress( $this, 
$newPerson );
    if( !is_null( $newPerson ) ) $newPerson->addPostalAddress( $this );
    return $this;
  }

  /**
   * @ORM\Id
   * @ORM\Column( name = "id", type = "integer" )
   * @ORM\GeneratedValue( strategy = "SEQUENCE" )
   * @var int
   */
  protected $id = null;

  /**
   * @ORM\ManyToOne( targetEntity = "Person", inversedBy = 
"postalAddresses" )
   * @ORM\JoinColumn( name = "person_id", referencedColumnName = "id", 
nullable = false );
   * @var Person
   */
  protected $person = null;
}

?>

It seems that it works either way but what is the intended (i.e. correct) 
way to go? If it is sufficient to do the notification at the owning side, 
the getters and setters for the ArrayCollection can be simplified and a 
costly clone of the ArrayCollection can be avoided. Instead of my current 
code the following snippet would be enough:
public function addPostalAddress( PostalAddress $postalAddress = null ) {
  if( is_null( $postalAddress ) ) return $this;
  if( $this->postalAddresses->contains( $postalAddress ) ) return $this;
  $this->postalAddresses->add( $postalAddress );
  $postalAddress->setPerson( $this );
  return $this;
}
This seems to work, too, but will it do so in future versions of Doctrine?

-- 
You received this message because you are subscribed to the Google Groups 
"doctrine-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/doctrine-user.
For more options, visit https://groups.google.com/d/optout.

Reply via email to