J'ai été confronté à un problème similaire lors de la construction d'un enregistreur soutenu par la base de données. Pour éviter la fatigue d'avertissement, j'attribue à chaque message un UID qui est un hachage de son contenu d'identification et fait de l'UID une clé unique. Naturellement, cela nécessite que je détermine si un enregistrement existe déjà qui correspond à cette valeur UID (dans mon cas, j'incrémente une valeur count
pour cet enregistrement de journal et touche son horodatage updated_at
).
Je fini remplaçant Doctrine_Record::save()
dans ma classe de modèle, de façon similaire à ce (code ajustée pour être plus pertinent à votre situation):
/** Persists the changes made to this object and its relations into the
* database.
*
* @param $conn Doctrine_Connection
* @return void
*/
public function save(Doctrine_Connection $conn = null)
{
/* Invoke pre-save hooks. */
$this->invokeSaveHooks('pre', 'save');
/* Check to see if a duplicate object already exists. */
if($existing = $this->getTable()->findDuplicate($this))
{
/* Handle duplicate. In this case, we will return without saving. */
return;
}
parent::save($conn);
}
UserTable::findDuplicate()
ressemble à ceci:
/** Locates an existing record that matches the specified user's email (but
* without matching its PK value, if applicable).
*
* @param $user User
*
* @return User|bool
*/
public function findDuplicate(User $user)
{
$q =
$this->createQuery('u')
->andWhere('u.email = ?', $user->email)
->limit(1);
if($user->exists())
{
$q->andWhere('u.id != ?', $user->id);
}
return $q->fetchOne();
}
Notez que C'est probablement une meilleure approche pour remplacer preSave()
plutôt que save()
dans votre modèle. Dans mon cas, j'ai dû attendre que les hooks de pré-sauvegarde soient exécutés (l'UID a été défini en utilisant un Doctrine template that I had created), donc j'ai dû remplacer save()
à la place.