Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Kolom CakePHP 3 kali mendapat tanggal ditambahkan

Nilai Tanggal/Waktu semuanya dicor ke struktur dasar yang sama, yaitu DateTime atau DateTimeImmutable objek, dan secara alami nilai hanya tanggal akan memiliki nilai waktu yang ditambahkan (00:00:00 ), dan nilai waktu saja datang dengan tanggal (tanggal saat ini).

CakePHP akan menggunakan subclass tertentu tergantung pada tipe data SQL, yaitu

  • \Cake\I18n\Time atau \Cake\I18n\FrozenTime untuk TIME , TIMESTAMP , dan DATETIME
  • \Cake\I18n\Date atau \Cake\I18n\FrozenDate untuk DATE

Di versi CakePHP 3 sebelumnya hanya ada \Cake\I18n\Time .

Akan lebih baik jika akan ada kelas terpisah untuk tipe waktu saja, yang akan memiliki set format keluaran default hanya waktu yang tepat, tetapi sampai sesuatu seperti itu ditambahkan, Anda harus mengurus sendiri format keluaran .

Format dalam tampilan Anda

Terserah Anda bagaimana menampilkan ini dalam pandangan Anda. Anda dapat dengan mudah menggunakan i18nFormat() metode Time contoh kelas

$record['start_time']->i18nFormat(
    [\IntlDateFormatter::NONE, \IntlDateFormatter::SHORT]
)

atau Time pembantu, untuk menunjukkan hanya bagian waktu

$this->Time->i18nFormat(
    $record['start_time'],
    [\IntlDateFormatter::NONE, \IntlDateFormatter::SHORT]
)

Kira tidak ada salahnya jika panggang akan menghasilkan kode serupa sesuai dengan jenis kolom, Anda mungkin ingin menyarankan itu sebagai peningkatan . Seperti yang disebutkan menggunakan kelas tambahan (atau mungkin opsi) untuk kolom waktu saja mungkin merupakan sesuatu yang layak untuk dipertimbangkan juga.

Gunakan kelas waktu khusus

Jika Anda menginginkan perilaku ini di mana pun representasi string objek digunakan, tanpa harus secara manual memanggil formatter, maka Anda dapat menggunakan \Cake\I18n\Time yang diperluas atau \Cake\I18n\FrozenTime kelas dengan $_toStringFormat yang diganti properti, sehingga memformat tanggal yang sesuai.

src/I18n/FrozenTimeOnly.php

namespace App\I18n;

use Cake\I18n\FrozenTime;

class FrozenTimeOnly extends FrozenTime
{
    protected static $_toStringFormat = [
        \IntlDateFormatter::NONE,
        \IntlDateFormatter::SHORT
    ];
}

src/config/bootstrap.php

use Cake\Database\Type\TimeType;
use App\I18n\FrozenTimeOnly;
TimeType::$dateTimeClass = FrozenTimeOnly::class;

// remove the default `useImmutable()` call, you may however
// want to keep further calls for formatting and stuff
Type::build('time'); 
// ...

Ini seharusnya cukup jelas, time kolom yang sedang dipetakan ke TimeType , sekarang akan menggunakan App\I18n\FrozenTimeOnly alih-alih Cake\I18n\Time default .

DateTimeType::$dateTimeClass sudah usang

Untuk mengatasinya, tipe database khusus akan diperlukan, yang juga cukup sederhana.

src/Database/Type/TimeOnlyType.php

namespace App\Database\Type;

use App\I18n\FrozenTimeOnly;
use Cake\Database\Type\TimeType;

class TimeOnlyType extends TimeType
{
    public function __construct($name)
    {
        parent::__construct($name);
        $this->_setClassName(FrozenTimeOnly::class, \DateTimeImmutable::class);
    }
}

Perlu dicatat bahwa saat ini ini akan membuat instance kelas data/waktu dua kali, karena konstruktor induk akan memanggil _setClassName() juga, yang mana sebuah instance dari kelas yang diberikan akan dipakai.

src/config/bootstrap.php

use App\Database\Type\TimeOnlyType;
Type::map('time', TimeOnlyType::class);

Jadi yang akan dilakukan adalah mengganti time default ketik pemetaan untuk menggunakan \App\Database\Type\TimeOnlyType khusus kelas, yang pada gilirannya akan menggunakan \App\I18n\TimeOnly class saat mengonversi nilai database ke objek PHP, yang saat dikonversi ke string, akan menggunakan format hanya waktu.

Lihat juga



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Versi mana yang merupakan Server MySQL saya?

  2. 2 catatan teratas MySQL per grup

  3. Bagaimana cara mengatur charset untuk MySQL di RODBC?

  4. Apakah nama tabel di MySQL case sensitif?

  5. Grup MySQL Berdasarkan Baris Berturut-turut