Comment faire une entité de plage de dates avec un champ Date uniquement dans Drupal 8?

8

Dans Drupal 8, le champ Date uniquement stocke les données dans une colonne varchar au format CCYY-MM-DD , par exemple, 2016-04-18 .

En tant que tel, vous ne pouvez plus simplement faire une requête d'entité basée sur un horodatage supérieur à ( > = ), inférieur à ( <= ) ou similaire.

Existe-t-il une solution simple sur la façon de gérer cela? Plus précisément, j'essaie de faire deux requêtes, l'une où le champ de date a entre 14 et 21 jours, et l'autre où le champ de date a 21 jours et plus.

Déchiffrer
la source
Ça ne >=marche pas ? 20160318> = 20160218
kiamlaluno
Les données sont stockées sous la forme XXXX-XX-XX(2016-04-18), donc ce n'est techniquement pas un nombre, donc faire une condition numérique contre cela ne serait pas valide.
Déchiffrer le
1
'2016-04-18' > '2016-03-18'travaille pour moi et '2014-04-18' > '2018-02-01'revient FALSE. Oui, c'est une comparaison de chaînes, mais étant donné le format de chaîne, cela devrait fonctionner. Après tout '1' < '2',.
kiamlaluno
1
Le problème serait peut-être avec '0001' < '2'.
kiamlaluno

Réponses:

16

Je fais beaucoup de conditions comme ça dans les requêtes d'entité, je n'ai pas encore rencontré de problème.

La principale chose à savoir est le fuseau horaire dans lequel les données sont stockées, c'est-à-dire UTC. Vous devez le convertir en fuseau horaire de stockage (il y a une constante pour cela), ou votre requête sera désactivée de quelques heures.

Voici un exemple basé sur quelque chose que je fais.Si vous ne stockez que des jours, il existe également une constante pour le formatage.

$date = new DrupalDateTime('21 days ago');
$date->setTimezone(new \DateTimezone(DATETIME_STORAGE_TIMEZONE));
$formatted = $date->format(DATETIME_DATETIME_STORAGE_FORMAT);

$nids = \Drupal::entityQuery('node')
  ->condition('your_date_field.value', $formatted, '<=')
  ->range(0, 50)
  ->execute();
Berdir
la source
Cela fonctionnait très bien pour un champ avec horodatage - dans la base de données était le stockage 2016-07-18T13:00:00, mais Drupal a correctement géré la conversion et la comparaison en utilisant cette configuration.
geerlingguy