sql >> データベース >  >> RDS >> Mysql

CakePHP3の時間列に日付が追加されます

    日付/時刻の値はすべて同じ基本構造、つまりDateTimeにキャストされています またはDateTimeImmutable オブジェクトであるため、当然、日付のみの値には時間値が追加されます(00:00:00 )、および時間のみの値には日付(現在の日付)が付いています。

    CakePHPは、SQLデータ型に応じて特定のサブクラスを使用します。つまり

    • \Cake\I18n\Time または\Cake\I18n\FrozenTime TIMEの場合 、TIMESTAMP 、およびDATETIME
    • \Cake\I18n\Date または\Cake\I18n\FrozenDate DATEの場合

    以前のCakePHP3バージョンでは、\Cake\I18n\Timeしかありませんでした 。

    時間のみのタイプ用に別のクラスがあり、適切な時間のみのデフォルトの出力形式が設定されていると便利ですが、そのようなものが追加されるまでは、出力形式を自分で管理する必要があります。 。

    ビューのフォーマット

    これをビューに表示する方法はあなた次第です。 i18nFormat()を簡単に使用できます Timeのメソッド クラスインスタンス

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

    またはTime ヘルパー、時間の部分のみを表示する

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

    bakeが列のタイプに応じて同様のコードを生成する場合でも問題はないと思います。 拡張機能として提案する 。前述のように、時間のみの列に追加のクラス(またはオプション)を使用することも検討する価値があります。

    カスタム時間クラスを使用する

    フォーマッタを手動で呼び出さなくても、オブジェクトの文字列表現が使用されているすべての場所でこの動作が必要な場合は、拡張された\Cake\I18n\Timeを利用できます。 または\Cake\I18n\FrozenTime オーバーライドされた$_toStringFormatを持つクラス プロパティ。それに応じて日付をフォーマットします。

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

    これはほとんど自明であるはずです、time TimeTypeにマップされている列 、App\I18n\FrozenTimeOnlyを使用するようになります デフォルトのCake\I18n\Timeの代わりに 。

    DateTimeType::$dateTimeClass 非推奨です

    これに対処するには、カスタムデータベースタイプが必要になりますが、これもかなり単純です。

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

    親コンストラクターが_setClassName()を呼び出すため、現在、これによりデータ/時間クラスが2回インスタンス化されることに注意してください。 また、特定のクラスのインスタンスがインスタンス化される場所でもあります。

    src / config / bootstrap.php

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

    つまり、これが行うことは、デフォルトのtimeをオーバーライドすることです。 カスタム\App\Database\Type\TimeOnlyTypeを使用するためのタイプマッピング クラス。これにより、\App\I18n\TimeOnlyが使用されます。 データベース値をPHPオブジェクトに変換するときのクラス。文字列に変換すると、時間のみの形式が使用されます。

    関連項目



    1. EntityFrameworkでストアドプロシージャを呼び出す方法は?

    2. SQLServerで削除されたデータベースを追跡する方法

    3. テーブルが存在するかどうかを確認し、存在しない場合はSQLServer2008で作成します

    4. DelphiでのBDEとADO