Comment remplacer l'action PreUpdate de ne pas modifier mon champ `updated_at` dans Doctrine?
Question
Je veux désactiver le comportement automatique de changer le champ « updated_at » lorsqu'un objet est mis à jour. Je veux le faire manuellement; ou tout au moins, ont la posibilité de le désactiver comme voulu.
Je sais que je peux le faire en construisant mon propre comportement comme dans cette grande réponse . Mais je cherchais quelque chose de « propre » modification d'un auditeur de l'objet.
- J'ai essayé de passer outre l'action PreUpdate () sur le modèle.
- J'ai essayé de désactiver les auditeurs, et rien:
-
Doctrine::getTable('Place')->getRecordListener()->setOption('disabled', true);
// or
Doctrine::getTable('Place')->getRecordListener()->setOption('disabled', array('preUpdate'));
// As reference, I've used these two lines on a Symfony Task
plus d'idées, ou le code à regarder?
merci!
La solution
d'après les documents à http: //www.doctrine-project.org/documentation/manual/1_1/nl/behaviors:core-behaviors#timestampable si vous voulez utiliser timestampable mais pas la partie mise à jour, il suffit d'utiliser:
Timestampable:
updated:
disabled: true
Et ajoutez dans votre propre champ updated_at dans la section colonnes.
Autres conseils
Vous pouvez accéder à l'auditeur directement à partir de votre objet comme ceci:
$listenerChain = $this->getListener();
$i = 0;
while ($listener = $listenerChain->get($i))
{
if ($listener instanceof Doctrine_Template_Listener_Timestampable)
{
$listener->setOption('disabled', true);
break;
}
$i++;
}
La façon la plus simple de le faire serait de renommer le champ updated_at
à autre chose. Alors qu'il est ignoré par la doctrine.
De cette façon, vous pouvez contrôler le contenu du champ exactement.
// get the first (in our case the timstampable) listener for the record
$timestampable = $record->getListener()->get(0);
// disable setting of created_at at the timestampable listener
$timestampable->setOption(array('created' => array('disabled' => true)));
problème est que vous devez connaître la position de l'auditeur
vous pouvez également désactiver tous les auditeurs de cette façon:
$record->getListener()->setOption('disabled',true);