我正在使用CodeIgniter 3和PostgreSQL 9.4数据库。如果数据库中相应列的数据类型为布尔值,有没有一种方法可以在PHP中获取布尔值?
我是按照以下方式使用CodeIgniters查询构建器类的:
$qry = $this->db->get_where('user', array('username' => mb_strtolower($username)));
return $qry->row();
用户表中的所有布尔值都由字符串('t'和'f')表示。
我正在使用CodeIgniter 3和PostgreSQL 9.4数据库。如果数据库中相应列的数据类型为布尔值,有没有一种方法可以在PHP中获取布尔值?
我是按照以下方式使用CodeIgniters查询构建器类的:
$qry = $this->db->get_where('user', array('username' => mb_strtolower($username)));
return $qry->row();
用户表中的所有布尔值都由字符串('t'和'f')表示。
有一个更好的解决方案:使用PDO驱动程序,例如:
$db['default']['dsn'] = 'pgsql:host=localhost;dbname=base';
$db['default']['username'] = 'username';
$db['default']['password'] = 'password';
$db['default']['dbdriver'] = 'pdo';
$db['default']['port'] = 5432;
那么你得到的结果将是正确的类型。
在postgre驱动程序中的响应(json_encode):
{
"created_at": "2017-10-20 12:20:49",
"created_by": "82027609253",
"updated_at": "2017-10-20 12:20:49",
"updated_by": "82027609253",
"deleted": "f",
"id": "184",
"codigo_ibge": "1501402",
"uf": "PA",
"nome": "Belém"
}
PDO驱动程序中的响应(json_encode):
{
"created_at": "2017-10-20 12:20:49",
"created_by": 82027609253,
"updated_at": "2017-10-20 12:20:49",
"updated_by": 82027609253,
"deleted": false,
"id": 184,
"codigo_ibge": 1501402,
"uf": "PA",
"nome": "Belém"
}
<?php
class PgSqlObject
{
public function __set($name, $value)
{
if ($value === 'f')
$value = false;
elseif ($value === 't')
$value = true;
$this->$name = $value;
}
public function __get($name)
{
if (isset($this->$name))
{
return $this->$name;
}
}
}
$this->db->query($sql)->custom_result_object('PgSqlObject');
不行。
如果您在插入或更新数据时使用布尔值,CodeIgniter会将它们转换,但是在获取记录时无法进行转换,因为它没有读取的数据类型知识 - 它是一个查询构建器,而不是ORM。
您可以创建一堆类来表示特定的结果集,并在获取时使用custom_result_object() or custom_row_object()。
显然,这些自定义对象必须执行't'/'f'到true/false的转换。