CakePHP 3 Query Builder
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.