Magento 2 kiểu dữ liệu. Cần THỜI GIAN (trong ngày)


7

Có vẻ như kiểu dữ liệu cột TIME( chẳng hạn datetime, chỉ là thời gian trong ngày12:00 ) không được hỗ trợ Magento 2.

Tôi cần lưu trữ một thời gian trong ngày, làm thế nào để làm việc này?
Làm thế nào tôi nên đi về nó với các công cụ và kiểu dữ liệu có sẵn?

Tôi đã nghĩ về việc lưu một ngày bình thường nhưng đặc biệt (như 1970-01-01 12:00:00đủ khác biệt để không gây nhầm lẫn cho bất kỳ ai duyệt dữ liệu) và chỉ trích xuất phần thời gian từ đó trong đó UI, nhưng điều đó thật kinh khủng và khiến tôi chùn bước.

Có cách nào thanh lịch hơn?


Bạn có thể tạo định dạng TIME nếu nó chưa tồn tại?
Robbie Averill

@RobbieAverill đã cố gắng a) ghi đè và mở rộng lớp Magento\Framework\DB\Ddl\Tablebằng các bổ sung của riêng tôi và b) chỉnh sửa Magento\Framework\DB\Ddl\Table trực tiếp, nhưng điều đó không có ích (có tất cả các loại lỗi khi thiết lập: nâng cấp). Bạn có thể cụ thể hơn với những gì bạn muốn nói bằng cách tạo định dạng TIME? Zend db nên hỗ trợ kiểu dữ liệu thời gian, nhưng 1. chỉnh sửa và thêm loại cột 'TIME' trong lớp Magento \ Framework \ DB \ Ddl \ Bảng 2. gọi Bảng-> addColumn với loại 'TIME' và mọi kết hợp tùy chọn chỉ gây ra [Zend_Db_Exception] Invalid column definition data
Kampaviineri

Câu trả lời:


2

Tôi đã giải quyết điều này bằng cách sử dụng DATETIME ban đầu

$table = $installer->getConnection()
        ->newTable($installer->getTable('MYTABLE'))
        ->addColumn(
            'MYCOLUMN', 
            \Magento\Framework\DB\Ddl\Table::TYPE_DATETIME, null,
           ['unsigned' => true, 'nullable' => true],
            'Comment about table'
        );

`

và sau đó chỉ sử dụng thực thi sql thô với

$installer->run('ALTER TABLE MYTABLE MODIFY MYCOLUMN TIME');

Và đó là nó, vấn đề được giải quyết.


1

Magento ORM không thực hiện các loại ngày kỳ lạ. Bạn có hai lựa chọn:

  1. Viết lại mỗi lớp DDL trong Magento 2.0 Framework và đau đầu để duy trì nó với mỗi bản phát hành mới của Magento 2.0 vì nó có thể bị hỏng.

  2. Sử dụng một kiểu dữ liệu có sẵn khác, không nhất thiết là một ngày liên quan đến ngày, bởi vì nó có thể giới thiệu sự suy giảm hiệu suất. Bạn có thể thử sử dụng INT chỉ là một chữ số đại diện cho thời gian. Sau đó, ví dụ, 10:11:43sẽ được biểu diễn dưới dạng giá trị như vậy trong cột số nguyên 101143. Và bạn vẫn có thể thực hiện thao tác tương tự trên mức MySQL như với thường xuyên TIMEthời gian ( BETWEEN, <, >, vv). Không có sự suy giảm hiệu suất trong việc sử dụng int thay vì thời gian. (Tôi không khuyên bạn nên VARCHARđại diện vì tìm kiếm chậm hơn chỉ mục của nó)


0

Nếu tôi phải thành thật: hãy làm điều đó 'The Magento Way ™'. Đó là cách bạn ít có khả năng bị đau đầu nhất với khả năng tương thích về phía trước. Tôi biết, tôi cũng muốn xem một TIMEloại, nhưng nếu Magento chỉ hỗ trợ DATETIME(rất có thể là do sự trừu tượng của nguồn dữ liệu), thay vào đó, hãy sử dụng nó, ngay cả khi nó khiến bạn co rúm lại.

Ai biết được ... có thể một ngày nào đó Magento có thể quyết định rằng phiên bản 2.x sẽ hỗ trợ cơ sở dữ liệu mới hơn, nhanh hơn mà không hỗ trợ TIME. Sau khi viết lại DDL của bạn (hoặc thay đổi bảng thô của bạn một cách nhanh chóng) có thể có một số tác dụng phụ khó chịu sau đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.