Bagaimana cara melakukan entitas rentang tanggalQuery dengan bidang Tanggal saja di Drupal 8?

8

Dalam Drupal 8, bidang Date only menyimpan data dalam kolom varchar dalam format CCYY-MM-DD , misalnya, 2016-04-18 .

Dengan demikian, Anda tidak bisa lagi melakukan lebih dari ( > = ), lebih sedikit dari ( <= ) atau entitas lain berdasarkan timestamp lagi.

Apakah ada solusi sederhana tentang cara menghadapinya? Secara khusus saya mencoba melakukan dua kueri, satu di mana bidang tanggal adalah antara 14 dan 21 hari, dan satu di mana bidang tanggal adalah 21 dan lebih hari.

Menguraikan
sumber
Tidak >=bekerja 20160318> = 20160218
kiamlaluno
Data disimpan sebagai XXXX-XX-XX(2016-04-18), jadi secara teknis bukan angka, oleh karena itu melakukan kondisi numerik terhadapnya tidak akan valid.
Menguraikan
1
'2016-04-18' > '2016-03-18'bekerja untuk saya, dan '2014-04-18' > '2018-02-01'kembali FALSE. Ya, ini adalah perbandingan string, tetapi mengingat format string, itu harus berfungsi. Lagipula '1' < '2',.
kiamlaluno
1
Masalahnya adalah dengan '0001' < '2', mungkin.
kiamlaluno

Jawaban:

16

Saya melakukan banyak kondisi seperti itu dalam query entitas, saya belum mengalami masalah.

Hal utama yang harus Anda perhatikan adalah zona waktu data disimpan, yaitu UTC. Anda perlu mengubahnya ke zona waktu penyimpanan (ada konstanta untuk itu), atau permintaan Anda akan dimatikan beberapa jam.

Berikut ini contoh berdasarkan sesuatu yang saya lakukan, jika Anda hanya menyimpan hari, maka ada konstanta untuk memformatnya juga.

$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
sumber
Ini bekerja sangat baik untuk bidang dengan cap waktu — dalam basis data penyimpanannya seperti itu 2016-07-18T13:00:00, tetapi Drupal menangani konversi dan perbandingan dengan benar menggunakan pengaturan ini.
geerlingguy