sql >> Database teknologi >  >> RDS >> Mysql

CakePHP 3-tidskolonnen tilføjes dato

Dato/klokkeslæt værdier bliver alle castet til den samme basisstruktur, det vil sige en DateTime eller DateTimeImmutable objekt, og derfor vil værdier med kun dato naturligvis have en tidsværdi tilføjet (00:00:00 ), og tidsværdier kommer med en dato (den aktuelle dato).

CakePHP vil bruge specifikke underklasser afhængigt af SQL-datatypen, det vil sige

  • \Cake\I18n\Time eller \Cake\I18n\FrozenTime i TIME , TIMESTAMP og DATETIME
  • \Cake\I18n\Date eller \Cake\I18n\FrozenDate for DATE

I tidligere versioner af CakePHP 3 var der kun \Cake\I18n\Time .

Det ville være rart, hvis der ville være en separat klasse for kun tidsbegrænsede typer, som ville have et ordentligt standard outputformat indstillet til kun tidsbegrænset, men indtil sådan noget tilføjes, skal du selv sørge for outputformatet .

Formatér i dine visninger

Det er op til dig, hvordan du viser dette i dine visninger. Du kan nemt bruge i18nFormat() metoden for Time klasseforekomst

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

eller Time hjælper, for kun at vise tidsdelen

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

Tror det ikke ville skade, hvis bake ville generere lignende kode i henhold til kolonnens type. Du kan eventuelt foreslå det som en forbedring . Som nævnt kan det også være værd at overveje at bruge yderligere klasser (eller måske muligheder) for tidsbestemte kolonner.

Brug en tilpasset tidsklasse

Hvis du ville have denne adfærd overalt, hvor strengrepræsentationen af ​​objektet bliver brugt, uden at skulle aktivere formateringsværktøjet manuelt, så kunne du gøre brug af en udvidet \Cake\I18n\Time eller \Cake\I18n\FrozenTime klasse med en tilsidesat $_toStringFormat egenskab, så den formaterer datoen i overensstemmelse hermed.

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'); 
// ...

Dette burde stort set være selvforklarende, time kolonner, der tilknyttes TimeType , vil nu bruge App\I18n\FrozenTimeOnly i stedet for standard Cake\I18n\Time .

DateTimeType::$dateTimeClass er forældet

For at klare det, vil en brugerdefineret databasetype være påkrævet, hvilket også er ret simpelt.

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);
    }
}

Det skal bemærkes, at dette i øjeblikket vil instansiere en data/tidsklasse to gange, da den overordnede konstruktør vil kalde _setClassName() også, hvilket er hvor en instans af den givne klasse vil blive instansieret.

src/config/bootstrap.php

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

Så hvad dette vil gøre, er at tilsidesætte standard time skriv mapping for at bruge den tilpassede \App\Database\Type\TimeOnlyType klasse, som igen vil bruge \App\I18n\TimeOnly klasse, når databaseværdier konverteres til PHP-objekter, som, når de konverteres til en streng, vil bruge kun tidsformatet.

Se også



  1. Sådan bruges Where-klausulen i Select Statement i SQL Server - SQL Server / TSQL Tutorial Del 109

  2. Sådan flyttes en model mellem to Django-apps (Django 1.7)

  3. fejl ved at køre apache efter xampp-installation

  4. Rumbibliotek kan kopiere db fra aktivmappen?