THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

Rejoignez la communauté sur le Discord Thelia : https://discord.gg/YgwpYEE3y3

Offline


Hello!

Dans un module j'ai un champ date qui se met à jour comme ça :

 $maClass->setDate(date('Y-m-d H:i:s'))->save();

À priori tout fonctionne correctement.

J'ai voulu faire pareil dans un autre module... mais ça ne me prend pas l'heure... (dans la BDD j'ai 18/06/2021 00:00:00)

J'ai tout vérifié et tout est identique :

<column name="exported" type="DATE" />
$this->addColumn('exported', 'Exported', 'DATE', true, null, null);

Par contre en fouinant, j'ai constaté que dans le module où ça fonctionne ça convertit en DateTime Object... et de l'autre ça reste en string...

Une piste?


Aide les autres, ils t'aideront en retour.

Offline


Quels sont les modules en question ?
Si cela fonctionne dans un module et pas dans l'autre pour la même définition de champs c'est que la vérité est ailleurs...

Il est probable que la méthode setDate dans le module qui fonctionne opère une transformation avant d'enregistrer l'information en bdd.

Autre piste : tu as fait ton test cette nuit à 00:00:00 pile big_smile

Last edited by Nog (18-06-2021 14:00:09)

Offline


Voilà un peu de comparaison de l'un et l'autre :

//schema
<column name="date" required="true" type="DATE" />
<column name="exported" type="DATE" />

//sql
`date` DATETIME NOT NULL,
`exported` DATETIME NOT NULL,

//set
->setDate(date('Y-m-d H:i:s'))
->setExported(date('Y-m-d H:i:s'))

public function setDate($v)
{
	if ($v !== null) {
		$v = (string) $v;
	}

	if ($this->date !== $v) {
		$this->date = $v;
		$this->modifiedColumns[MonModuleATableMap::DATE] = true;
	}


	return $this;
} // setDate()
public function setExported($v)
{
	if ($v !== null) {
		$v = (string) $v;
	}

	if ($this->exported !== $v) {
		$this->exported = $v;
		$this->modifiedColumns[MonModuleBOrderTableMap::EXPORTED] = true;
	}


	return $this;
} // setExported()

//hydrate
$this->date = (null !== $col) ? (string) $col : null;
$this->exported = (null !== $col) ? (string) $col : null;

et tout est similaire...

Sauf que dans la BDD
pour "date" j'ai 2021-06-02 07:44:49
pour "exported" j'ai 2021-06-21 00:00:00


Est-ce que "date" ne subirait pas un traitement spécifique via le core dû à son nommage ?

Last edited by Elyos (21-06-2021 10:23:51)


Aide les autres, ils t'aideront en retour.

Offline


Bon bah j'ai fouiné jusqu'à tomber sur :

 public function formatTemporalValue($value, ColumnMap $cMap)
    {
        /** @var $dt PropelDateTime */
        if ($dt = PropelDateTime::newInstance($value)) {
            switch ($cMap->getType()) {
                case PropelTypes::TIMESTAMP:
                case PropelTypes::BU_TIMESTAMP:
                    $value = $dt->format($this->getTimestampFormatter());
                    break;
                case PropelTypes::DATE:
                case PropelTypes::BU_DATE:
                    $value = $dt->format($this->getDateFormatter());
                    break;
                case PropelTypes::TIME:
                    $value = $dt->format($this->getTimeFormatter());
                    break;
            }
        }

        return $value;
    }

qui transforme les valeurs...

J'ai refait un test avec le module qui fonctionnait et bim ça m'a enregistré la date avec l'heure "00:00:00".

Donc j'ai sûrement modifier quelque chose entre temps.

Il faut donc mettre comme type TIMESTAMP (schema et map) si on veut enregistrer une date avec l'heure.


Aide les autres, ils t'aideront en retour.

Offline


Par contre, j'ai pas la bonne heure ^^'


Aide les autres, ils t'aideront en retour.

Offline


Je relance ce sujet suite à un souci de requête...

Dans ma bdd à l'enregistrement les dates sont égales à "0000-00-00 00:00:00" (en cas d'export ou d'envoi ces dates ce mettent à jour).

Quand je lance une requête avec filterByDate("0000-00-00 00:00:00") ça ne me retourne rien... et pour cause... ça me convertit "0000-00-00 00:00:00" en date et donc ça devient "0001-00-31 00:00:00.000000"

Comment y remédier ? rajouter une clause en "dur" dans ma requête ?


Aide les autres, ils t'aideront en retour.

Offline


Bon bah pour ceux qui cherchent comment faire... suffit de faire :

filterByDate(null)

Aide les autres, ils t'aideront en retour.

Offline


Mieux : filterByDate(null, Criteria::ISNULL)


OpenStudio Toulouse

Offline


roadster31 wrote:

Mieux : filterByDate(null, Criteria::ISNULL)

Salut roadster!

'ISNULL' ça oblige pas que le champ soit 'null' ? parce que là il est à '0000-00-00 00:00:00' donc non 'null'...


Aide les autres, ils t'aideront en retour.