PD
Usando funções e subselects em critérios
Fechado
Olá,
Uma funcionalidade já existente na versão 1.0.3, mas pouco explorada, é a possibilidade de usar subqueries e funções de banco na definição de critérios para busca de coleções na base de dados. Neste pequeno artigo, procurarei explicar estes dois recursos.
O comportamento padrão da classe TFilter é tratar o terceiro parâmetro como um valor, adicionando "aspas" ao redor. Entretanto, se o terceiro parâmetro iniciar com "(SELECT", ele é tratado como uma subquery, e portanto não serão acrescentadas "aspas" ao redor.
Uma funcionalidade já existente na versão 1.0.3, mas pouco explorada, é a possibilidade de usar subqueries e funções de banco na definição de critérios para busca de coleções na base de dados. Neste pequeno artigo, procurarei explicar estes dois recursos.
O comportamento padrão da classe TFilter é tratar o terceiro parâmetro como um valor, adicionando "aspas" ao redor. Entretanto, se o terceiro parâmetro iniciar com "(SELECT", ele é tratado como uma subquery, e portanto não serão acrescentadas "aspas" ao redor.
<?php$criteria = new TCriteria;$criteria->add(new TFilter('id', 'IN', '(SELECT customer_id FROM purchases)'));// resultado: (id IN (SELECT customer_id FROM purchases))?>
Além disso, em alguns casos precisamos usar funções do banco de dados para efetuar comparações e outras operações. Neste caso, podemos forçar que o terceiro parâmetro não tenha "aspas" na composição do Select, por meio do acréscimo do prefixo NOESC: no terceiro parâmetro. Neste exemplo, a data de nascimento deve ser menor ou igual ao dia de hoje menos 2 anos.
<?php$criteria = new TCriteria;$criteria->add(new TFilter('birthdate', '<=', "NOESC:date(now()) - '2 years'::interval"));// resultado: (birthdate <= date(now()) - '2 years'::interval)?>
Ótimo artigo Pablo
Lembrando que para ordenar os dados (ORDER BY) segue o mesmo conceito: