CakePHP 3 Query Builder

Erik Figueiredo
3 min readMay 25, 2015

--

Uma das novas ferramentas mais legais do CakePHP 3 é o Query Builder. O antigo find() já nos dava muita liberdade, o novo recurso realmente vai muito além, agora ele não executa a busca, ele somente gera o SQL (princípio da responsabilidade única).

Imagine você buscar artigos de uma determinada categoria, eles devem estar atívos para aparecer e você ainda dever ordenar tudo por order de cadastro.

No CakePHP 2 poderia ficar assim:

$conditions = array(
‘category_id’=>1,
‘ativo’=>1
);
$order = ‘created DESC’;
$data = $this->Model->find(‘all’, compact(‘conditions’, ‘order’));

E a variável $data vai te trazer os resultados do banco de dados. Agora as coisas são um pouco diferentes, temos uma construção mais estruturada a objetos e menos a arrays.

$query = $this->Model->find()
->where([
‘category_id’=>1,
‘ativo’=>1
])->order(‘created DESC’);
$data = $query->all();

A primeira vantagem é que o sql fica guardado na variável $query, é só dar um debug() ou var_dump() pra ver o que está acontecendo, a segunda é que agora podemos fazer vários tipos de consulta usando a mesma query, é só usar all() para pegar todos (ou vários) dados, first() para pegar um só (ou o primeiro) e count() para contar os registros, que tal testarmos?

$query = $this->Model->find()
->where([
'category_id'=>1,
'ativo'=>1
])->order('created DESC');
debug($query->all());
debug($query->first());
debug($query->count());

Se você não gostou, não tem problema, o formato antigo (com arrays) continua funcionando, então você não perde nada.

E o read() com isso?

O read() agora virou get() e continua simples de usar:

$data = $this->Model->get(1)

Dispensa explicações, mas vou insistir em explicar. O parâmetro 1 é o id do registro que queremos, pode ser um $id, por exemplo. Ainda temos um segundo parâmetro e este funciona exatamente como o antigo formato de arrays que o CakePHP 2 já usava.

E o Containable?

Agora ele já vem ativo no ORM (o novo model, que agora é separado entre Table e Entity) do CakePHP, e continua simples de usar. Você pode fazer como fazia antigamente (usando o formato de arrays) quando usar o get() ou usar o query builder orientado a objetos, veja:

$query = $this->Model->find()
->where([
'category_id'=>1,
'ativo'=>1
])
->order('created DESC')
->contain([
'Category'
]);
//ou com get()$data = $this->Model->get(1, [
'contain'=>['Category']
]);

Conclusão

Trabalhar com as novas ferramentas do CakePHP 3 é realmente muito poderoso, prático e eficiente, além de conhecer novos padrões e ficar por dentro das novidades mais interessantes do PHP.

Fica esperto que logo sai mais artigos sobre CakePHP 3

Continue estudando

Aqui tem mais alguns artigos meus pra você ler.

--

--