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.
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.
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:
Obrigado Felipe,
Ah sim, você está se referindo à definir uma ordem padrão no onReload() das list controllers, como aqui:
www.adianti.com.br/framework_files/tutor/index.php?class=CustomerDat
Lembrando que a classe TCriteria tem o método setProperty() para definir a ordenação:
www.adianti.com.br/framework_files/tutor/index.php?class=CollectionL
Abraço,
Pablo
Bom Dia Pablo,
E quando o campo tem na Classe e nao tem no BD, como funciona ???
Tens como nos ajudar ???
Aguardo Noticias
Grande abraço