Em nosso projeto, usamos consultas MySQL nativas para buscar nossos dados. Desta forma, podemos pular a parte pesada do ORM, mas isso nos tornou um problema irritante. Sempre que fizemos um select que deveria retornar um inteiro, ele foi transformado em uma string.
Exemplo:
Base de dados
position int(11)
Inquerir
$sql = "SELECT g.position FROM goal g";
$stmt = $this->conn->executeQuery($sql);
var_dump($stmt->fetchAll());
Resposta
array (size=2)
0 =>
array (size=3)
'position' => string '2' (length=1)
1 =>
array (size=3)
'position' => string '1' (length=1)
Portanto, você pode ver que nossa consulta retornou todas as posições que encontramos, mas todas foram transformadas em strings, embora as tenhamos declaradas como inteiros.
Como podemos consertar isso?
ETAPA 1: Instale o driver nativo do MySQL e remova o antigo
sudo apt-get remove php5-mysql
sudo apt-get install php5-mysqlnd
ETAPA 2: mude a opção 20 em suas configurações de doutrina
Na doutrina
$params = array(
'driver' => 'pdo_mysql',
'dbname' => 'mydb',
'host' => 'localhost',
'user' => 'root',
'password' => '',
'charset' => 'utf8',
'driverOptions' => array(
PDO::ATTR_EMULATE_PREPARES => FALSE
)
);
No symfony
doctrine:
dbal:
default_connection: default
connections:
default:
driver: "%database_driver%"
host: "%database_host%"
port: "%database_port%"
dbname: "%database_name%"
user: "%database_user%"
password: "%database_password%"
charset: UTF8
options:
20: false
Mais informações
20 = PDO :: ATTR_EMULATE_PREPARES
http://php.net/manual/en/pdo.setattribute.php
Nova resposta
array (size=2)
0 =>
array (size=3)
'position' => int 2
1 =>
array (size=3)
'position' => int 1
Aproveitar!
Agradecimentos extras: @wmolenberghs
Todas as minhas dicas foram movidas para o meu blog www.pix-art.be, então venha conferir!