8719 sujets

Développement web côté serveur, CMS

Hello

- Symfony 2.8,
- PHP 5.4
- SQLSERVER

Donc voila, je souhaite insérer un champ date. Pas de soucis sauf qu'il me garde pas les minutes...

Création de la date :
 $date = DateTime::createFromFormat('d/m/Y H:i:s', date("d/m/Y H:i:s"));
var_dump($date);die;


Résultat du vardump :
object(DateTime)#886 (3) { ["date"]=> string(26) "2018-03-19 12:52:53.000000" ["timezone_type"]=> int(3) ["timezone"]=> string(13) "Europe/Berlin" }

Donc on remarque bien l'heure / minutes...

Dans SQL Server par contre j'ai la bonne date mais pas niveau heure/MINUTES j'ai 00:00:00. Je comprend pas pourquoi .
Modifié par JENCAL (19 Mar 2018 - 12:56)
Modérateur
Bonjour,

alors ça, c'est assez moche:


$date = DateTime::createFromFormat('d/m/Y H:i:s', date("d/m/Y H:i:s"));

(Ce qui a pour effet de prendre le timestamp actuel, de le formatter en chaîne puis de le parser pour obtenir une date Smiley ola

plutôt:


$date = new  DateTime();


Sinon il faudrait en savoir plus sur le mapping Doctrine et le type de colonne en SQL pour pouvoir aider.
Oui je viens de modifier et j'ai rajouté dans mon constructeur le new DateTime, le résultat reste le même
    /**
     * Constructor
     */
    public function __construct()
    {
        $this->Maj = new \DateTime();
    }


. Mon champ dans sql server est de type DATETIME

dans mon ORM également
    /**
     * @var \DateTime
     *
     * @ORM\Column(name="MAJ", type="datetime", nullable=true)
     */
    private $Maj;
Pas compris....
Il ne supporte pas DATETIME mais pourtant ma date s'ajoute bien ... enfin.. à moité car l'heure reste à zéro..
Modérateur
Eh bien tu devrais laisser Doctrine gérer tes tables (c'est le but normalement).

Si tu gères toi-même tes tables il faudrait suivre les specs, sinon tu auras des erreurs ou des résultats imprévus.
mais je laisse gérer lol j'utilise l'orm....

Je fais rien à part remplir l'objet l'objet date permettant l'insertion dans la base.
Modifié par JENCAL (19 Mar 2018 - 14:17)
Bon,,

On peut voir quand dans mon profiler, la requête executer par doctrine est la suivante :

INSERT INTO fiche_mere (CDV, Qte, MAJ, id_marque) VALUES (?, ?, ?, ?)
Parameters: { 1: PAR/LIM-LIM/PEM-PEM/CUZ-JUL/LIM-LIM/PAR, 2: 1, 3: '2018-03-19', 4: null }


Il faut donc que je vois comment lui préciser de prendre les heures également...
Ce qui est compliqué car je lui envoi l'objet DATETIME qui contient de base la date + les heures... je continue de chercher...
Modérateur
Normalement cela devrait fonctionner de base.

Tu n'as pas fait de changement en oubliant un doctrine:schema:update ?
non.

J'ai créer mes tables dans sql, et ensuite forcé la creation d'entités via doctrine en ligne de commande.... j'ai rien fait d'autres...
je continue de chercher.
Modérateur
JENCAL a écrit :
non.

J'ai créer mes tables dans sql, et ensuite forcé la creation d'entités via doctrine en ligne de commande.... j'ai rien fait d'autres...
je continue de chercher.

C'est bien ce que je disais, normalement tu laisses doctrine créer tes tables. Tu es sûr que ce n'est pas un problème avec le type de colonne dans ta table non compatible?
kustolovic a écrit :

C'est bien ce que je disais, normalement tu laisses doctrine créer tes tables.

je lis juste la doc.. https://symfony.com/doc/2.8/doctrine/reverse_engineering.html
donc le comportement "normal" est "normal" pour celui qui l'utilise "normalement" mais pour moi si la fonctionnalité existe dans la doc officiel je peux qualifié l'opération (entity to table) de normal. mais chacun son point de vue... même si dans la future version de symfony on ne pourra plus le faire.

kustolovic a écrit :

Tu es sûr que ce n'est pas un problème avec le type de colonne dans ta table non compatible?.

Certains, car si j'ajoute manuellement l'heure dans ma requête cela fonctionne bien... C'est vraiment doctrine qui garde juste la date et non l'heure dans le profiler (dans l'insert into).... je ne sais pas pourquoi il parse ....
Je lui donne l'objet au complet... donc je pense que c'est dans le moteur direct de l'orm que ce parsing est fait. je fouille....
Modifié par JENCAL (19 Mar 2018 - 16:43)
Modérateur
Je dis «normal» car la procédure inverse est délicate, mène potentiellement à des erreurs et requiert de nombreux ajustements manuels (il vaut mieux l'éviter si possible).

Sinon modifier manuellement la requête, ça fonctionne évidement, le problème est que doctrine comprends mal ton type je pense.
a écrit :

Doctrine assumes that you use DateTime2 data-types. If your legacy database contains DateTime datatypes then you have to add your own data-type (see Basic Mapping for an example).
Modérateur
Non, d'ailleurs Microsoft préconise d'utiliser datetime2 pour tous les nouveaux travaux , car il est plus précis, plus large et compatible SQL (ce que datetime n'est pas, c'est un bricolage propriétaire oldschool)
Ok merci pour l'infos, je vais casser ma base est la reconstruire avec datetime2 et re-tester... Smiley smile