Repository navigation
Open
Labels
Description
https://codeigniter4.github.io/CodeIgniter4/models/entities.html#property-casting
The object handler seems to expect the property to be set to an array.
CodeIgniter4/system/Entity/Cast/ObjectCast.php
Lines 22 to 25 in 0cd3993
| public static function get($value, array $params = []): object | |
| { | |
| return (object) $value; | |
| } |
CodeIgniter4/tests/system/Entity/EntityTest.php
Lines 439 to 449 in 0cd3993
| public function testCastObject(): void | |
| { | |
| $entity = $this->getCastEntity(); | |
| $data = ['foo' => 'bar']; | |
| $entity->sixth = $data; | |
| $this->assertIsObject($entity->sixth); | |
| $this->assertInstanceOf('stdClass', $entity->sixth); | |
| $this->assertSame($data, (array) $entity->sixth); | |
| } |
However, when setting an array, we cannot save that Entity to the database.
$entity = new class () extends Entity {
protected $casts = [
'id' => 'int',
'active' => 'int-bool',
'memo' => 'object', // Use `object` handler
];
};
$model = new class () extends Model {
protected $table = 'users';
protected $allowedFields = [
'username', 'active', 'memo',
];
protected $useTimestamps = true;
};
$entity->fill(['username' => 'johnsmith', 'active' => false, 'memo' => ['foo', 'bar']]);
$model->save($entity); // CodeIgniter\Database\Exceptions\DatabaseException : Operand should contain 1 column(s)How is this handler used in the first place?
Activity
neznaika0 commentedon Oct 8, 2023
@iRedds seems to have created it.
In my opinion, the conversion is not necessary. If you want to convert an
array, then it should be in the database as JSON andjson,json-arrayshould be used. The concept of anobjectis too big, therefore it requires a custom CastIt's probably worth adding
@deprecatedand replacing saving and conversion with JSONmichalsn commentedon Oct 8, 2023
I have never used it. It is useless to me in the context of a relational database. Maybe for NoSQL or other scenarios, it might have some use.
kenjis commentedon Oct 10, 2023
Yes, it seems useless in the context of a relational database.
But even for NoSQL, why don't you set an object to an entity, instead of an array?
michalsn commentedon Oct 11, 2023
Good point. I honestly can't imagine a valid scenario 🤷♂️