Método ToString () para ver a instrução SQL bruta gerada pelo Drupal SelectQuery

Então, ontem eu escrevi outro post no Coderwall sobre a tentativa de escrever um EntityFieldQuery onde um fieldCondition é na verdade um campo fornecido pelo Módulo de Acesso ao Domínio. Acabei tendo que usar a classe SelectQuery padrão.

Enquanto escrevia minha consulta, estava usando a página / devel / php para testar os resultados da minha consulta, mas continuava recebendo “erros inesperados” ao tentar executá-la. Consegui determinar que o ato de adicionar o método -> execute () estava causando o problema, mas estava tendo um peido no cérebro e não conseguia descobrir se estava errado. No final, eu não estava especificando quais campos eu queria que fossem retornados na consulta, mas só consegui descobrir isso por causa do método toString () disponibilizado pela classe SelectQuery.

$query = db_select('node', 'n');
$query
->innerJoin('domain_source', 'd', 'n.nid = d.nid');
$query
->condition('n.type', 'my_node_type_name', '=');
$query
->condition('d.domain_id', '-5', '!=');

A camada de abstração do banco de dados do Drupal é muito legal, mas às vezes você realmente quer saber qual é a consulta SQL final que o Drupal está executando, para que você possa ver o que pode estar errado com a consulta.

Insira o método toString () da classe SelectQuery .

Para disparar o método __toString (), você precisa converter a variável $ query em uma string antes de realmente executar o método execute ().

print (string) $query;

Ao fazer isso, fui capaz de determinar que não estava selecionando nenhum campo e que minha string SQL resultante estava faltando alguns componentes necessários e, claro, seria sintaticamente inválida.

Eu tive algo parecido com o seguinte gerado:

SELECIONE
DE {nó} n
INNER JOIN {domínio} d ON (n.nid = d.nid)
ONDE n.type = {: db placeholder 1} AND d.domain id = {: db placeholder_2}

Ficou muito óbvio neste ponto que eu não estava selecionando nenhum campo específico. Eu havia assumido anteriormente que, se eu não especificasse um campo, ele executaria um select *, mas eu estava incorreto.

Agradeço a Mario de Sydney, Austrália, que escreveu este artigo que me ajudou a perceber meu erro.