codeigniter4 / CodeIgniter4

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

[Postgre][Entity] cast boolean in entity from PostgreSQL is always true #7483

Open shishamo opened 1 year ago

shishamo commented 1 year ago

PHP Version

8.1

CodeIgniter4 Version

4.3.4

CodeIgniter4 Installation Method

Composer (as dependency to an existing project)

Which operating systems have you tested for this bug?

macOS

Which server did you use?

apache

Database

PostgreSQL 15.2

What happened?

When try to cast boolean value in entity when use PostgreSQL the value is always true

When check the entity the value true is set as string t, and the value false is set as string f

The BooleanCast cast as (bool) $value so the value always returns true

Steps to Reproduce

class TestEntity extends BaseEntity
{
    protected $casts = [
        'bolean_value'  => 'boolean',
    ];
    protected $datamap = [
        'boleanValue' => 'bolean_value',
    ];
}
class TestModel extends APIBaseModel
{
    protected $table = 'postgresql_table';
    protected $returnType = TestEntity::class;
}
class TestController extends BaseController
{
    protected $modelName = TestModel::class;

    public function find(): Response
    {
        return $this->respond($this->model->first());
    }
}

Expected Output

{
    "boleanValue": false
}

When postgresql DB entry is false but always returns true

Anything else?

No response

shishamo commented 1 year ago

@kenjis is there any update to that issue?

kenjis commented 1 year ago

No. I think this is not a bug. The current implementation does not support PostgreSQL bool type. Supporting it needs an enhancement. If you need it, try to send a PR to 4.4 branch.

iRedds commented 1 year ago

You can extend the BooleanCast class and cast the type you need.

@kenjis Entity is a representation of data and is not directly related to the DBMS. I don't think this is a good solution.

kenjis commented 1 year ago

@iRedds What do you mean? You think adding PostgreBooleanCast is better? I think it is better that BooleanCast supports PostgreSQL boolean type column if possible.

shishamo commented 1 year ago
<?php

namespace App\Entities\Cast;

use CodeIgniter\Entity\Cast\BooleanCast as BaseCast;

class BooleanCast extends BaseCast
{
    public static function get($value, array $params = []): bool
    {
        if ($value === 't') {
            return true;
        }
        if ($value === 'f') {
            return false;
        }

        return parent::get($value, $params);
    }
}

Actually this is what i have done in my own extended cast.

But i was wondering why it is not handled by CI by default because the Postgre driver exists

iRedds commented 1 year ago

@kenjis I think it should be left as is.

kenjis commented 1 year ago

@iRedds CI4 supports PostgreSQL but the Entity cannot support boolean type column. Isn't it a missing feature?

iRedds commented 1 year ago

@kenjis But Entity is not part of the database layer. And the desired result can be obtained through a getter or custom type casting. Now, if we didn’t have the opportunity to get the desired result, then this would be a missing function.

kenjis commented 7 months ago

8243 would solve this issue.

shishamo commented 7 months ago

Thank you @kenjis ~