Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonsoir,
J'ai deux tables identique au niveau de leur schéma et je dois à la validation manuelle des données insérés dans A , les copier dans B.
Avec Doctrine puis-je faire cela rapidement sans faire les setters de tous mes champs de B ?
Merci
Hors ligne
Salut, si c'est deux tables, c'est deux modèles ... Sinon tu peux le mettre dans une autre base et tu utilises un deuxième EM .
Hors ligne
Je suis pas hyper sur de la question... Ca me semble être le rôle d'un hydrator, mais je ne suis pas convaincu qu'il faille s'embêter à ce point dans ton cas...
Peux-tu détailler le problème ? Peut-être juste un setter:
[lang=php] class A { private $test; private $testSetter; private $notInB; public function __construct($test, $testSetter, $notInB) { $this->test = $test; $this->testSetter = $testSetter; $this->notInB = $notInB; } public function getTest() { return $this->test; } public function getTestSetter() { return $this->testSetter; } public function getNotInB() { return $this->notInB; } } class B { private $test; private $testSetter; private $unknown; public function setTestSetter($testSetter) { $this->testSetter = $testSetter; } public function fromObjectA(A $objectA) { $vars = get_class_vars(__CLASS__); foreach($vars as $name => $value) { $getter = 'get'.ucfirst($name); $setter = 'set'.ucfirst($name); if(method_exists($objectA, $getter)) { if(method_exists($this, $setter)) { $this->$setter($objectA->$getter()); } else { $this->$name = $objectA->$getter(); } } else { /** * @todo add log */ } } } } $a = new A('testTest', 'testTestSetter', 'testNotInB'); var_dump($a); $b = new B(); var_dump($b); $b->fromObjectA($a); var_dump($b);
Hors ligne
Bonjour a vous deux, merci pour votre temps
Le problème :
J'ai 3 classe proforma(aperçu de commande avant facturation), un utilisateur doit vérifier le montant des facture, et leur conformité etc... puis valider l'aperçu pour enregistrer en base les donnés definitives qui deviendront des factures.
Mes tables address et articles proforma sont rigoureusement identique à address et articles de facture, et pour faire transiter la donné de mes table proforma à fatcure je voulais savoir s'il n'y avait pas une méthode plus simple, que de me taper ligne par ligne :
[lang=php] $factureAddress->setNom($proformaAddress->getNom());
J'ai regardé ce que tu as mis Théocrite, mais j'avoue avoir légèrement compris le concept, si tu peux développer
J'espère être plus clair en tous cas.
Hors ligne
Mon concept en gros est de passer ligne par ligne, sauf qu'au lieu de faire ça "bourrin", j'ai fait quelques tests.
Mon exemple comporte plusieurs cas, qui couvrent à mon avis les cas possibles.
Globalement:
- l'objet B est factureAddress, l'objet A est proformaAddress
- on accède aux propriétés de A par un getter
- le setter dans B est optionel
On injecte A dans un objet B, et pour chacun des champs de B (destination), on teste si A contient le getter.
Si A n'a pas de getter, on loggue et probablement lève une exception ou quoi (mon todo).
Si A a un getter pour le champ en question, soit B a un setter et on utilise le setter, soit il n'en a pas et on utilise une assignation directe.
On est donc sur de ne pas avoir d'exception, et on a la possibilité d'avoir un setter tout de même si on veut effectuer une transformation dans B
Hors ligne
Bonjour,
Merci de ta réponse
J'ai fait un autre solution.
Qu'en pense tu ? :
[lang=php] foreach ($proforma->getAddress() as $address) { $datas = $address->getObjectAsArray(); $datas['idFacture'] = $lastInvoiceID; $connection->insert('factureAddress', $datas); }
Ce code est dans une transaction.
ou getObjectasArray est dans mes entités :
[lang=php] public function getObjectAsArray() { return get_object_vars($this); }
Hors ligne
C'est essentiellement la même idée en effet
Pour moi ça marche, par contre je ne mettrais pas les inserts là, je ferais un tableau que j'insererai par la suite.
Hors ligne
Pages: 1