Bagaimana menerapkan bidang tanggal mysql atau datetime dengan benar di hook_schema ()?


13

Saya telah menulis file mymodule.install yang berisi definisi skema untuk membuat tabel di database saya. Tabel ini berisi dua bidang data. Bidang ini akan diisi oleh pengguna saat mereka akan mengisi konten tertentu (misalnya: untuk menentukan tanggal publikasi untuk suatu berita). Sekarang saya tidak menggunakan modul kontribusi Tanggal sengaja, karena saya perlu bahwa dua bidang ini berada di baris yang sama di tabel database karena alasan lain.

Hook_schema mendefinisikan dua bidang dengan cara ini:

'pubblish_date' => array(
    'description' => t('The pubblish date for the single news'),
    'mysql_type' => 'datetime',
    'not null' => FALSE,
  ),
  'unpublish_date' => array(
    'description' => t('The unpublish date for the single news'),
    'mysql_type' => 'datetime',
    'not null' => FALSE,
  ),

Tabel dibuat dengan benar dalam database, tetapi saya selalu mendapatkan pesan saran ini:

Bidang news_board.pubblish_date: tidak ada tipe Skema untuk datetime tipe mysql. Bidang news_board.unpublish_date: tidak ada tipe Skema untuk datetime tipe mysql. news_board.pubblish_date: tidak ada tipe untuk tipe Skema: normal. Field news_board.pubblish_date: tidak ada tipe Skema untuk tipe. news_board.unpublish_date: tidak ada tipe untuk tipe Skema: normal. Bidang news_board.unpublish_date: tidak ada tipe Skema untuk tipe.

Sepertinya aneh bagi saya karena saya merah pada dokumentasi untuk menggunakan spesifikasi mysql_type untuk menyimpan format datetime dalam database mysql.

Saya tahu bahwa Drupal mendukung cap waktu asli dan jika Anda ingin menyimpan format tanggal yang berbeda, Anda harus menggunakan definisi spesifik seperti mysql_type atau pgsql_type sesuai dengan database yang Anda gunakan.

Dalam diskusi saya menemukan banyak orang online menggunakan definisi mysql_type dan dari apa yang saya lihat mereka memecahkan masalah, jadi mengapa itu tidak berhasil bagi saya?

Terima kasih banyak.

Jawaban:


12

Anda harus memberikan tipe cadangan ( varchar) untuk kasus bahwa database bukan mysql.

'pubblish_date' => array(
  'description' => t('The pubblish date for the single news'),
  'type' => 'varchar',
  'mysql_type' => 'datetime',
  'not null' => FALSE,
),
'unpublish_date' => array(
  'description' => t('The unpublish date for the single news'),
  'type' => 'varchar',
  'mysql_type' => 'datetime',
  'not null' => FALSE,
),

Namun, pesan yang Anda lihat berasal dari modul Skema . Masalah ini sudah dicatat sebagai masalah # 468644 .

Implementasi datetime mysql dalam skema Anda baik-baik saja. Anda dapat dengan aman mengabaikan pesan-pesan ini. Saya akan mengatakan bahwa "pesan saran" ini disebabkan oleh bug dalam modul Skema.


Hai Gisle, terima kasih atas jawabannya. Saya baru saja melakukan modifikasi yang Anda sarankan dan ya, itu menciptakan tabel dalam database tetapi saya masih mendapat saran ini: •Field news_board.pubblish_date: no Schema type for mysql type datetime. •Field news_board.unpublish_date: no Schema type for mysql type datetime.
Marco

Ya saya tahu, saya telah menonaktifkan dan mencopotnya tetapi hasilnya sama. Versi inti yang saya gunakan adalah 7.22. Saya ingin menentukan bahwa saya memiliki modul skema juga diinstal. Saran yang disebutkan muncul ketika saya mencoba memeriksa skema database dengan modul ini. Jujur saya tidak mencoba untuk memeriksa apakah mereka juga muncul di bagian lain dari antarmuka admin. Saya juga bertanya-tanya apakah saya dapat mengabaikan pesan ini pada saat ini dan melanjutkan membangun modul. Saya tidak tahu apakah ini akan memengaruhi fungsionalitas modul itu sendiri.
Marco

OK, terima kasih banyak atas waktu Anda, Gisle, Anda menghemat banyak uang saya!
Marco

0

Jika Anda perlu menggunakan tipe catatan yang tidak termasuk dalam daftar tipe yang didukung secara resmi, Anda bisa menentukan tipe untuk setiap backend database.

Dalam hal ini, Anda dapat mengabaikan parameter tipe, tetapi maklumi bahwa skema Anda akan gagal memuat pada backend yang tidak memiliki tipe yang ditentukan. Solusi yang mungkin adalah dengan menggunakan tipe "teks" sebagai fallback. ( https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Database%21database.api.php/group/schemaapi/8.2.x )

'submit_date' => array( 'type' => 'varchar', 'mysql_type' => 'datet', )

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.