Open kenjis opened 10 months ago
After calling find()
, nothing changes, because attributes are just copied as strings. After the change, castAs()
is applied.
Yes, if we change the date and save the object, toRawArray()
returns the Time
object.
@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
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
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.
Steps to Reproduce
Expected Output
Returns string value
'2023-12-12 12:12:12'
?Anything else?
No response