Skip to content

Bug: Entity::toRawArray() may return Time object #8302

Description

@kenjis

PHP Version

8.1

CodeIgniter4 Version

4.4.3 and develop

CodeIgniter4 Installation Method

Git

Which operating systems have you tested for this bug?

macOS

Which server did you use?

cli-server (PHP built-in webserver)

Database

MySQL 8.0.34

What happened?

The following code returns Time object.

        $user->updated_at = '2023-12-12 12:12:12';
        var_dump($user->toRawArray());

Steps to Reproduce

+----+------------+--------------------+---------+--------------------+--------------------+------------+
| id | name       | email              | country | created_at         | updated_at         | deleted_at |
+----+------------+--------------------+---------+--------------------+--------------------+------------+
| 1  | John Smith | john@example.co... | US      | 2023-12-07 04:0... | 2023-12-07 04:0... |            |
+----+------------+--------------------+---------+--------------------+--------------------+------------+
<?php

namespace App\Models;

use App\Entities\User;
use CodeIgniter\Model;

class UserModel extends Model
{
    protected $table            = 'user';
    protected $returnType       = User::class;
    protected $allowedFields    = [
        'name',
        'email',
        'country',
    ];

    // Dates
    protected $useTimestamps = true;
    protected $dateFormat    = 'datetime';
    protected $createdField  = 'created_at';
    protected $updatedField  = 'updated_at';
    protected $deletedField  = 'deleted_at';
}
<?php

namespace App\Entities;

use CodeIgniter\Entity\Entity;

class User extends Entity
{
    protected $datamap = [];
    protected $dates   = ['created_at', 'updated_at', 'deleted_at'];
    protected $casts   = [];
}
    public function index()
    {
        $users = new UserModel();
        /** @var User $user */
        $user = $users->find(1);
        var_dump($user->toRawArray());

        $user->updated_at = '2023-12-12 12:12:12';
        var_dump($user->toRawArray());

        $user = $users->find(1);
        var_dump($user->toRawArray());
    }
/Users/kenji/work/codeigniter/official/CodeIgniter4/app/Controllers/Home.php:15:
array (size=7)
  'id' => string '1' (length=1)
  'name' => string 'John Smith' (length=10)
  'email' => string 'john@example.com' (length=16)
  'country' => string 'US' (length=2)
  'created_at' => string '2023-12-07 04:00:48' (length=19)
  'updated_at' => string '2023-12-07 04:00:48' (length=19)
  'deleted_at' => null

/Users/kenji/work/codeigniter/official/CodeIgniter4/app/Controllers/Home.php:18:
array (size=7)
  'id' => string '1' (length=1)
  'name' => string 'John Smith' (length=10)
  'email' => string 'john@example.com' (length=16)
  'country' => string 'US' (length=2)
  'created_at' => string '2023-12-07 04:00:48' (length=19)
  'updated_at' => 
    object(CodeIgniter\I18n\Time)[88]
      protected 'timezone' => 
        object(DateTimeZone)[90]
          public 'timezone_type' => int 3
          public 'timezone' => string 'UTC' (length=3)
      protected 'locale' => string 'en' (length=2)
      protected 'toStringFormat' => string 'yyyy-MM-dd HH:mm:ss' (length=19)
      public 'date' => string '2023-12-12 12:12:12.000000' (length=26)
      public 'timezone_type' => int 3
      public 'timezone' => string 'UTC' (length=3)
  'deleted_at' => null

/Users/kenji/work/codeigniter/official/CodeIgniter4/app/Controllers/Home.php:21:
array (size=7)
  'id' => string '1' (length=1)
  'name' => string 'John Smith' (length=10)
  'email' => string 'john@example.com' (length=16)
  'country' => string 'US' (length=2)
  'created_at' => string '2023-12-07 04:00:48' (length=19)
  'updated_at' => string '2023-12-07 04:00:48' (length=19)
  'deleted_at' => null

Expected Output

Returns string value '2023-12-12 12:12:12'?

Anything else?

No response

Activity

  1. added
    bugVerified issues on the current code behavior or pull requests that will fix them
    on Dec 7, 2023
  2. neznaika0 commented on Dec 8, 2023

    @neznaika0
    Contributor

    After calling find(), nothing changes, because attributes are just copied as strings. After the change, castAs() is applied.

  3. kenjis commented on Dec 8, 2023

    @kenjis
    MemberAuthor

    Yes, if we change the date and save the object, toRawArray() returns the Time object.

  4. neznaika0 commented on Dec 13, 2023

    @neznaika0
    Contributor

    @kenjis got a question.
    What should $original contain? Data from the table as primitive types or modified data after castAs()? This is misleading. If we select an object from the table, apply casting and $entity->syncOriginal(), nothing will change globally (the data is relatively old - date type changed to Time), but the entity will change $original

  5. kenjis commented on Dec 13, 2023

    @kenjis
    MemberAuthor

    The $original is only for hasChanged().
    So it should contain the data for it.

    The current behavior:

        public function index()
        {
            $users = new UserModel();
    
            /** @var User $user */
            $user = $users->find(1);
            $user->updated_at = '2023-12-12 12:12:12';
            var_dump($user);
        }
    /Users/kenji/work/codeigniter/official/CodeIgniter4/app/Controllers/Home.php:17:
    object(App\Entities\User)[89]
      protected 'datamap' => 
        array (size=0)
          empty
      protected 'dates' => 
        array (size=3)
          0 => string 'created_at' (length=10)
          1 => string 'updated_at' (length=10)
          2 => string 'deleted_at' (length=10)
      protected 'casts' => 
        array (size=0)
          empty
      protected 'castHandlers' => 
        array (size=0)
          empty
      private array 'defaultCastHandlers' (CodeIgniter\Entity\Entity) => 
        array (size=15)
          'array' => string 'CodeIgniter\Entity\Cast\ArrayCast' (length=33)
          'bool' => string 'CodeIgniter\Entity\Cast\BooleanCast' (length=35)
          'boolean' => string 'CodeIgniter\Entity\Cast\BooleanCast' (length=35)
          'csv' => string 'CodeIgniter\Entity\Cast\CSVCast' (length=31)
          'datetime' => string 'CodeIgniter\Entity\Cast\DatetimeCast' (length=36)
          'double' => string 'CodeIgniter\Entity\Cast\FloatCast' (length=33)
          'float' => string 'CodeIgniter\Entity\Cast\FloatCast' (length=33)
          'int' => string 'CodeIgniter\Entity\Cast\IntegerCast' (length=35)
          'integer' => string 'CodeIgniter\Entity\Cast\IntegerCast' (length=35)
          'int-bool' => string 'CodeIgniter\Entity\Cast\IntBoolCast' (length=35)
          'json' => string 'CodeIgniter\Entity\Cast\JsonCast' (length=32)
          'object' => string 'CodeIgniter\Entity\Cast\ObjectCast' (length=34)
          'string' => string 'CodeIgniter\Entity\Cast\StringCast' (length=34)
          'timestamp' => string 'CodeIgniter\Entity\Cast\TimestampCast' (length=37)
          'uri' => string 'CodeIgniter\Entity\Cast\URICast' (length=31)
      protected 'attributes' => 
        array (size=7)
          'id' => string '1' (length=1)
          'name' => string 'John Smith' (length=10)
          'email' => string 'john@example.com' (length=16)
          'country' => string 'US' (length=2)
          'created_at' => string '2023-12-13 09:58:48' (length=19)
          'updated_at' => 
            object(CodeIgniter\I18n\Time)[88]
              protected 'timezone' => 
                object(DateTimeZone)[90]
                  ...
              protected 'locale' => string 'en' (length=2)
              protected 'toStringFormat' => string 'yyyy-MM-dd HH:mm:ss' (length=19)
              public 'date' => string '2023-12-12 12:12:12.000000' (length=26)
              public 'timezone_type' => int 3
              public 'timezone' => string 'UTC' (length=3)
          'deleted_at' => null
      protected 'original' => 
        array (size=7)
          'id' => string '1' (length=1)
          'name' => string 'John Smith' (length=10)
          'email' => string 'john@example.com' (length=16)
          'country' => string 'US' (length=2)
          'created_at' => string '2023-12-13 09:58:48' (length=19)
          'updated_at' => string '2023-12-13 09:58:48' (length=19)
          'deleted_at' => null
      private bool '_cast' (CodeIgniter\Entity\Entity) => boolean true
    
  6. added 2 commits that reference this issue on May 18, 2026
    b7f0796
    67a42dc
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugVerified issues on the current code behavior or pull requests that will fix them

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions