CodeIgniter4
CodeIgniter4 copied to clipboard
[Postgre][Entity] cast boolean in entity from PostgreSQL is always true
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
@kenjis is there any update to that issue?
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.
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.
@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.
<?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
@kenjis I think it should be left as is.
@iRedds CI4 supports PostgreSQL but the Entity cannot support boolean type column. Isn't it a missing feature?
@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.
#8243 would solve this issue.
Thank you @kenjis ~