Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cột thời gian CakePHP 3 được thêm ngày

Tất cả các giá trị Ngày / Giờ đều được truyền đến cùng một cấu trúc cơ sở, đó là DateTime hoặc DateTimeImmutable đối tượng, và vì vậy, các giá trị chỉ ngày tự nhiên sẽ có giá trị thời gian được thêm vào (00:00:00 ), và các giá trị chỉ thời gian đi kèm với ngày tháng (ngày hiện tại).

CakePHP sẽ sử dụng các lớp con cụ thể tùy thuộc vào kiểu dữ liệu SQL, đó là

  • \Cake\I18n\Time hoặc \Cake\I18n\FrozenTime trong TIME , TIMESTAMPDATETIME
  • \Cake\I18n\Date hoặc \Cake\I18n\FrozenDate cho DATE

Trong các phiên bản CakePHP 3 trước đó chỉ có \Cake\I18n\Time .

Sẽ rất tuyệt nếu có một lớp riêng biệt cho các loại chỉ thời gian, sẽ có một định dạng đầu ra mặc định chỉ thời gian thích hợp, nhưng cho đến khi một cái gì đó tương tự được thêm vào, bạn sẽ phải tự mình xử lý định dạng đầu ra. .

Định dạng trong chế độ xem của bạn

Làm thế nào để hiển thị điều này trong chế độ xem của bạn là tùy thuộc vào bạn. Bạn có thể dễ dàng sử dụng i18nFormat() phương thức của Time cá thể lớp

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

hoặc Time người trợ giúp, để chỉ hiển thị phần thời gian

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

Đoán rằng sẽ không có vấn đề gì nếu baking sẽ tạo mã tương tự theo loại cột, bạn có thể muốn đề xuất điều đó như một sự cải tiến . Như đã đề cập, việc sử dụng các lớp bổ sung (hoặc có thể là các tùy chọn) cho các cột chỉ thời gian cũng có thể là điều đáng để xem xét.

Sử dụng lớp thời gian tùy chỉnh

Nếu bạn muốn hành vi này ở mọi nơi mà biểu diễn chuỗi của đối tượng đang được sử dụng, mà không cần phải gọi trình định dạng theo cách thủ công, thì bạn có thể sử dụng \Cake\I18n\Time mở rộng hoặc \Cake\I18n\FrozenTime lớp có $_toStringFormat bị ghi đè , để nó định dạng ngày tháng cho phù hợp.

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

Điều này sẽ tự giải thích khá nhiều, time cột đang được ánh xạ tới TimeType , bây giờ sẽ sử dụng App\I18n\FrozenTimeOnly thay vì Cake\I18n\Time mặc định .

DateTimeType::$dateTimeClass không được dùng nữa

Để đối phó với điều đó, loại cơ sở dữ liệu tùy chỉnh sẽ được yêu cầu, loại cơ sở dữ liệu này cũng khá đơn giản.

src / Cơ sở dữ liệu / Loại / 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);
    }
}

Cần lưu ý rằng hiện tại điều này sẽ khởi tạo một lớp dữ liệu / thời gian hai lần, vì hàm tạo cha sẽ gọi _setClassName() cũng là nơi mà một phiên bản của lớp đã cho sẽ được khởi tạo.

src / config / bootstrap.php

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

Vì vậy, điều này sẽ làm, là ghi đè time mặc định gõ ánh xạ để sử dụng \App\Database\Type\TimeOnlyType tùy chỉnh , đến lượt nó sẽ sử dụng \App\I18n\TimeOnly khi chuyển đổi các giá trị cơ sở dữ liệu sang các đối tượng PHP, khi được chuyển đổi thành một chuỗi, sẽ sử dụng định dạng chỉ thời gian.

Xem thêm



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MYSQL Chọn từ các bảng dựa trên nhiều hàng

  2. Lỗi:Phương pháp hoặc hoạt động không được triển khai. trong khi Cơ sở dữ liệu MYSQL giàn giáo

  3. MySQL - Tìm điểm trong bán kính từ cơ sở dữ liệu

  4. Tôi có nên chuyển biến $ mysqli của mình cho mỗi hàm không?

  5. Vấn đề truy vấn Hibernate với Informix