codeigniter4 / CodeIgniter4

Open Source PHP Framework (originally from EllisLab)
https://codeigniter.com/
MIT License
5.28k stars 1.88k forks source link

How do you use `object` cast handler for Entity? #7993

Open kenjis opened 10 months ago

kenjis commented 10 months ago

https://codeigniter4.github.io/CodeIgniter4/models/entities.html#property-casting

The object handler seems to expect the property to be set to an array. https://github.com/codeigniter4/CodeIgniter4/blob/0cd39937d7a8dbd8074237596024adce0fe3c2af/system/Entity/Cast/ObjectCast.php#L22-L25 https://github.com/codeigniter4/CodeIgniter4/blob/0cd39937d7a8dbd8074237596024adce0fe3c2af/tests/system/Entity/EntityTest.php#L439-L449

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?

neznaika0 commented 10 months ago

@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 and json, json-array should be used. The concept of an object is too big, therefore it requires a custom Cast

It's probably worth adding @deprecated and replacing saving and conversion with JSON

michalsn commented 10 months ago

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 commented 10 months ago

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 commented 10 months ago

Good point. I honestly can't imagine a valid scenario 🤷‍♂️