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
untukTIME
,TIMESTAMP
, danDATETIME
\Cake\I18n\Date
atau\Cake\I18n\FrozenDate
untukDATE
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
- Cookbook> Time> Setting Default Lokal dan Format String
- Buku resep> Basis data Access &ORM> Dasar-Dasar Basis Data> Menambahkan Jenis Kustom