Seguinte:
Recentemente iniciei um projeto e optei por usar o Yii2 no mesmo (utilizo o yii1 no serviço, já estava familiarizado), porém... Notei que nas relations do Yii2, diferente do Yii1, o framework executa 2 queries... por exemplo:
Ao invés de:
SELECT interation.title, interation.message, user.name, user.email
FROM interations AS interation
LEFT JOIN users AS user ON (user.id = interation.user_id)
Ele executaria:
SELECT interation.title, interation.message, user.id
FROM interations AS interation
LEFT JOIN users AS user ON (user.id = interation.user_id)
SELECT * FROM users WHERE id = (id_obtido_a_cima)
Ou seja, enquanto no Yii1 ele cria a relation já buscando todos os dados que preciso, no Yii2, no join, ele apenas trás a FK da tabela que estou relacionando e posteriormente executa um SELECT * pela FK que retornou do join... nada interessante se pensando pra um sistema com muitas linhas de um grid, por exemplo, que em 10 linhas faria 20 consultas, performance vai lá pra vala! Acredito que tenham feito esta atualização por algum motivo que eu desconheço, alguém saberia como "burlar" isso, ou o motivo de ter sido feito desta maneira nesta nova versão?
Boa tarde. Estou assumindo que este erro não tem relação com o SQL porque eu executei a query diretamente no banco de dados e não recebi nenhum erro.
Quando acesso o site da empresa que trabalho no meu ambiente de desenvolvimento local, vejo a seguinte mensagem
SQLSTATE[HY000]: General error
The SQL being executed was:
Error Info: Array
(
[0] => HY000
)
↵
Caused by: PDOException
SQLSTATE[HY000]: General error
in /../vendor/yiisoft/yii2/db/Command.php at line 840
Onde o erro yiisoft/yii2/db/Command.php at line 840 está executando uma query de consulta à tabela de sessão, que tem a seguinte estrutura:
(
id CHAR(40) NOT NULL PRIMARY KEY,
expire INTEGER,
data BLOB,
user_id INTEGER
)
Analisando o Stack Trace, eu notei que o site faz essa busca pra verificar que o usuário está logado ou apenas visitando. Em algum momento cria um registro novo assim quando é acessado, salva o id num cookie PHPSESSID e então tenta buscar ele novamente, onde ele retorna esse erro.
//yiisoft/yii2/web/DbSession.php
public function readSession($id)
{
$query = new Query();
$query->from($this->sessionTable)
->where('[[expire]]>:expire AND [[id]]=:id', [':expire' => time(), ':id' => $id]);
if ($this->readCallback !== null) {
$fields = $query->one($this->db);
return $fields === false ? '' : $this->extractData($fields);
}
$data = $query->select(['data'])->scalar($this->db); // linha 147 - é a query que causa o erro
return $data === false ? '' : $data;
}
Não descobri onde ele cria o novo registro, mas parece que há uma falha aí, porque o campo data está ficando em branco, e acho que essa pode ser a causa.
Eu já reinstalei e atualizei o PHP, o Apache e o Postgre. Também formatei o computador e o erro continua. O que me surpreende, pois no ambiente de produção isso não ocorre.
Também tentei pular essa verificação de usuário, mas então o erro é substituído por outro de verificação de navegador, o qual escolhi não me aprofundar.
E por fim não consigo debugar. Tinha o ambiente bem configurado com o sublime text e o chrome, mas depois que cometi o erro de formatar não consegui configurar novamente.