2010-11-25 34 views
1

Tout d'abord, je tiens à dire un grand merci aux développeurs de Doctrine, les gars, vous êtes rock! Mon problème est le suivant:Doctrine2 + rejoindre les conditions

J'ai trois tables:

person (id, name, isActive) 
email (id, address, isActive) 
personEmailRel(id, personId, emaiId, isActive) 

Et je veux obtenir la liste des e-mails par personne:

/** 
* Unidirectional - Many persons have many emails 
* 
* @ManyToMany(targetEntity="Address_Model_Email") 
* @JoinTable(name="personEmailRel", 
* joinColumns={@JoinColumn(name="personId", referencedColumnName="id")}, 
* inverseJoinColumns={@JoinColumn(name="emailId", referencedColumnName="id")} 
*) 
*/ 
private $_emails; 

public function __construct() 
{ 
    $this->_emails = new Collections\ArrayCollection(); 
} 

public function getEmails() 
{ 
    return $this->_emails; 
} 

fonctionne très bien. Mais le problème est que je veux aussi mettre la condition d'addition dans la clause de jointure isActive = 1. Comment résoudre cela dans Doctrine2? Merci.

Répondre

0

Vous ne travaillez pas avec ManyToMany mais créez une troisième entité PersonEmail. Je trouve votre schéma de base de données très douteux cependant.

Pourquoi un email peut-il avoir beaucoup de personnes? Une relation OneToMany ne devrait-elle pas suffire dans ce cas? Je ne vois pas l'avantage de la table de jointure.

+0

La raison est que j'ai d'autres entités comme: société (ID, nom, isActive) et companyEmailRel (ID, companyId, emailId, isActive) Et enfin tous les emails dans un tableau. – yaroslav

+0

Mais est-il possible de définir la condition d'addition dans join ou de toute autre manière? – yaroslav

0

Doctrine ne supporte pas les conditions dans les associations, mais il y a plusieurs façons de résoudre ce:

élaborez une méthode référentiel qui interroge les entités liées que vous voulez. Voir Query et QueryBuilder.

Utilisez le Collection Criteria API pour filtrer les entités inactives de la collection dans un getter (dans votre entité). Si l'association est marquée comme "EXTRA_LAZY", les requêtes optimisées seront utilisées au lieu de récupérer la collection entière. Ceci est très utile pour les grandes collections.

Utilisez le Filter API pour filtrer les entités inactives au niveau de la base de données. C'est très utile lorsque vous voulez presque toujours cacher des entités inactives (ou supprimées, etc.).