6
votes

Utilisez UNIX TIMESTAMP dans la doctrine expressable

Comment utiliser des horodatages UNIX avec le comportement minutieux de la doctrine? J'ai trouvé le code suivant Snippet ici , mais je préfère ne pas ajouter manuellement Ceci partout: xxx


2 commentaires

Pourquoi ne pas utiliser l'horodatage par défaut qui utilise des champs DateTime?


Plus facile d'interagir avec des timbres d'époque simples.


3 Réponses :


2
votes

Une méthode consisterait à utiliser les auditeurs de doctorine pour créer un équivalent d'horodatage UNIX lorsque l'enregistrement est récupéré et avant d'être enregistré:

class Base extends Doctrine_Record_Listener
{
    public function preHydrate(Doctrine_Event $event)
    {
        $data = $event->data;

        $data['unix_created_at'] = strtotime($data['created_at']);
        $data['unix_updated_at'] = strtotime($data['updated_at']);

        $event->data = $data;
    }
}


0 commentaires

33
votes

Il s'agit d'une question qui pourrait avoir une réponse plus facile que ce que j'ai pensé, en réalité ...

Commençons par ce que vous avez maintenant: p>

  • une classe de modèle, qui s'étend doctrine_record code>
    • Je vais appelerez ce cours test code>, pour mon exemple (s). Li>
    • Dans ce modèle de test code> code>, vous souhaitez utiliser le comportement code> horodatage >>, mais avec des horodatages UNIX, et pas datetime code> valeurs li>
    • Et vous voulez cela sans avoir à écrire beaucoup de choses de configuration dans vos modèles.
      (je peux comprendre que: moins de risque d'oublier une ligne quelque part et à des données erronées dans dB) em> li> ul> li>
    • un projet configuré et tout
      • Ce qui signifie que vous savez que vous vous troncez avec la doctrine li>
      • et que je ne parlerai pas des bases li> ul> li> UL>

        Une solution à ce problème ne serait pas d'utiliser le comportement express par défaut horodatage code> avec la doctrine, mais que vous allez définir.
        qui signifie, dans votre modèle, vous aurez quelque chose comme celui-ci au bas de SetferflinitionFinition Code> Méthode: p> xxx pré>

        (i Supposons que cela puisse aller dans la méthode code> Configuration code> aussi, BTW - peut-être que ce serait ce serait un endroit réel, en fait) em> p>


        Ce que nous devons maintenant faire Est-ce que définit le comportement code> mytimesthable, donc il fait ce que nous voulons.
        en tant que doctrine 'CODE> DOCTRINE_TEMPLATE_TIMESTAMBLABLE CODE> DÉJÀ LE JOINT ALÉCIALE (SAUF FORMAT, Bien sûr) EM>, nous en hériterons; Espérons que cela signifiera moins de code pour écrire ; -) strong> p>

        donc, nous déclarons notre classe de comportement comme ceci: p>

        mysql> select * from test;
        +----+--------+----------------+------------+------------+
        | id | name   | value          | created_at | updated_at |
        +----+--------+----------------+------------+------------+
        |  1 | Test 1 | My Value 1     | 1248805507 | 1248805507 |
        |  2 | Test 2 | My New Value 2 | 1248805583 | 1248805821 |
        +----+--------+----------------+------------+------------+
        2 rows in set (0.00 sec)
        


2 commentaires

C'est une bonne réponse et devrait vraiment être de +100.


Merci! Eh bien, en fait, cela a été +100: il y avait une prime (vaut 100 représentants) sur cette question; et ma réponse a été acceptée ^^



0
votes

c'est très simple. Il suffit de créer une méthode de setter pour votre champ avec un paramètre DateTime et utilisez la méthode de tostring pour la stocker comme entier.


0 commentaires