8768 sujets

Développement web côté serveur, CMS

Hello

j'utilise un merge() sur mon entity pour la mettre à jour

$em->merge($oSgd);
$em->flush();
$em->clear();


dans $oSgd j'ai modifié quelques champs

$oSgd->setIdStock($idStockCurrent);
$oSgd->setPrixHt($value[1][3]);
$oSgd->setTaxe($value[1][4]);
$oSgd->setTaxeFuel($value[1][5]);
$oSgd->setTotalTaxe($value[1][6]);


ce sont les seul champs que je viens modifié.
Cela fonctionne bien,
mais dans le debugger -> doctrine permettant de voir les requêtes SQL les rollbacks commit etc... je vois que mon UPDATE "rajoute" d'autre champs ?!

il me rajoute deux 3 champs de types datetimes.
ma table fait une vingtaine de colonnes, je souhaite modifié que quelque infos, mais celui me rajoute 3 colonne; à aucun moment je l'indique avec mes assesseurs/mutateur.....

Si je "cache" (que je met en commentaire) les champs date dans mon entité alors il n'apparaissent plus dans mon update (merge())... mais du coup je comprend pas.
à aucun moment je fait un ->setDateDeModif() ou autres.. et pourtant dans le debug doctrine je vois le champs dans l'update sql....

Quelqu'un aurait un piste ?
j'ai bien sûr nullable=true, donc les champs ne sont pas obligatoire.
Modérateur
Sans doute à cause du merge?

D'ou provient l'objet que tu merge et comment a-t-il été créé?

Cela me parait normal d'updater tous les champs après un merge, je ne vois pas comment doctrine saurait quels champs sont modifiés autrement?
Mon object provient de deux trois lignes au dessus.
c'est un findOneBy() qui me le créer.

mais pourquoi le merge me rajoute que les champs dates, et pas la 30 autres champs ?
car en modification il n'y a que les prix (les setPrix que j'ai partagé plus haut).

C'est comme un update de 5 champs sur 30

je précise que
setIdStock
setPrixHt
etc..
le merge devrait me créer un "update" avec uniquement ce que j'ai setter? je me trompe ?
Modifié par JENCAL (11 Mar 2020 - 10:24)
Salut,

C'est quoi ces champs dates exactement ?
Il y a peut être une fonctionnalité automatique qui rempli la date de création, la date de dernière modification.
ce sont des champs déclaré en datetime dans sql serveur/doctrine,

je n'ai rien de plus qu'une simple déclaration de champs, je me suis dit la même chose que toi Mathieu..

si je met en commentaire ma déclaration des champs datetime alors ils n'apparaissent plus dans la requête.. ça reste une grand mystère.


du coup ils sont déclarer comme cela :

    /**
     * @var \datetime
     *
     * @ORM\Column(name="date_de_modif", type="datetime", nullable=true)
     */
    //private $dateDeModif;


donc en commentaire pour le moment. rien de particulier..
Modérateur
JENCAL a écrit :

c'est un findOneBy() qui me le créer.

Du coup pourquoi utiliser merge() qui sert à synchroniser une entité désynchronisée plutôt que persists qui est plus correct? Cela pourrait éventuellement aider.

Autre possibilité, y a-t-il une conversion de type dans tes getter/setters de date?
Modifié par kustolovic (12 Mar 2020 - 12:04)
je vais tester un persist.
Non dans les getter setter il n'y a pas de conversion de type.
exemple :
	/**
	 * Set dateDeModifTaxe
	 *
	 * @param \DateTime $dateDeModifTaxe
	 *
	 * @return DateTime
	 */
	/*public function setdateDeModifTaxe($dateDeModifTaxe)
	{
		$this->dateDeModifTaxe = $dateDeModifTaxe;
		
		return $this;
	}*/
	
Modérateur
Je dis cela car il y a un aspect particulier avec doctrine sur les dates (et les objets en général), c'est que la comparaison se fait par référence:

https://www.doctrine-project.org/projects/doctrine-orm/en/2.7/cookbook/working-with-datetime.html

Si la date est la même mais l'instance DateTime est différente il y aura update. Mais si l'objet est chargé par doctrine puis persisté sans modifier la date cela ne devrait en effet pas être le cas.