Busca get rápida e exists

3 views
Skip to first unread message

( David . RJ . 2K )

unread,
Oct 10, 2009, 3:14:31 PM10/10/09
to SQLReactor Brasil
Olha só, eu tava fazendo um código doido aqui e me deparei com uma
"dificuldade".
Pra fazer um GET existe algumas coisas complexas, mas poderia
facilitar.

A idéia é a seguinte: ao fazer um GET sem parâmetros, ele faça uma
consulta de simplicidade extrema:
$user = new User();
$user->user = "admin";
$user->pass = "segredo"; // :p
$busca = $user->get(); // Mesmo que $user->get("User", array
("filter"=>array(array('user', '==', 'admin'), array('pass', '==',
'segredo'))));

Isso além de deixar o código mais "bonitinho" facilita o usuário, pois
algumas vezes não precisa repetir o código.
Por fim, o que gera é algo deste tipo:
$busca->id = 13;
$busca->user = "admin";
$busca->pass = "segredo";
$busca->email = "ad...@admin.com";

O mesmo serviria pra getList.

Pra completar, queria saber se existe (creio que não) algo do tipo:
$user = new User();
$user->user = "admin";
$user->pass = "segredo";
if($user->exists() == true) // Verifica se há ao menos 1 registro com
as informações passadas
e também:
if($user->count() == 1) // Seria o mesmo que o primeiro, porém, este
vai procurar por todas as ocorrências
como forma de otimizar, poderia também passar o necessário:
if($user->count(1) == true) // Isso quer dizer que vai ter um LIMIT 1,
se ENCONTRADO == $PARAMETRO, então TRUE

Entendeu?

Qualquer coisa, eu mesmo faço as alterações, então vocês validam.
Obrigado.

Rafael Martins

unread,
Oct 10, 2009, 3:45:45 PM10/10/09
to sqlreact...@googlegroups.com
David.

Vc tem feito observações interessantes. Mais interessante ainda é que ja vinha pensando em implementar coisas semelhantes à maioria dessas sugestões. Primeiro vamos a sua pergunta.

- Existe um método de count sim, que recebe os mesmos parâmetros de um get/getList, mas só retorna a quantidade de registros. Isso pode ser utilizado tanto para saber se existe algum no banco quanto para pegar a quantidade.

Ex:
$qtd = SQLReactor::count( 'User', array(
    'filter' => array(
        array( 'user', 'admin' ),
        array( 'password', 'segredo' )
    )
);

if( $qtd ){
    echo "existe";
}else{
    echo "nao existe";
}

- Estes 3 métodos podem receber o parametro de limit;

Ex:
//Retorna no max 5 objetos
$list = SQLReactor::getList( 'User', array(
    'filter' => array(
        array( 'active', true )
    ),
    'limit' => 5
);


Agora algumas observações sobre seu código:
   1 - Os métodos get, getList e count podem ser chamados de forma estática. Recomendo e eh a forma que eu mais uso. Também podem ser chamados na instância, porém, neste ultimo caso, não eh preciso passar o nome da classe (ele vai pegar o nome da classe da instancia).

Ex:
$list = SQLReactor::getList( 'User', array(
    'filter' => array(
        array( 'active', true )
    ),
    'limit' => 5
);

//Faz a mesma coisa q o de cima
$u = new User();
$u->getList( array(
    'filter' => array(
        array( 'active', true )
    ),
    'limit' => 5
);

Depois detalho melhor o que eu tinha pensado pra facilitar as buscas.

[]s,
Snit

2009/10/10 ( David . RJ . 2K ) <davi...@gmail.com>

( David . RJ . 2K )

unread,
Oct 10, 2009, 4:08:13 PM10/10/09
to SQLReactor Brasil
hehe sim... Agora vi que já tinha usado count() no código, mas então
lembrei que não era esse o problema, e sim o que citei acima, em
relação a refazer todo filtro de busca além de se basear nos dados que
já possui.

Falando em alterações, fiz as alterações sobre "conexão padrão". Vou
enviar para seu email os patchs e os arquivos finais.

Em breve, conforme eu for desenvolvendo, vou enviando outros patchs
para outras funções.

Ahh.. estou usando o SQLReactor na minha Framework (Miojo!), eu tinha
decidido não usar FW, mas me facilitou muito.
Ainda não foi implementado, mas se você ver o SVN vai notar que já
existe algo em relação a isso (ia usar o DOCTRINE, mas, dificil d+
hehe)

Valeu!
> 2009/10/10 ( David . RJ . 2K ) <david7...@gmail.com>

Rafael Martins

unread,
Oct 11, 2009, 1:08:04 PM10/11/09
to sqlreact...@googlegroups.com
Uau. 

Passei um dia fora e vc ja mandou milhares de coisas pra lista. Ja que está tão empolgado e já está tão por dentro, vou disponibilizar acesso pra vc no svn do projeto na sourceforge. Fiz basicamente sozinho mas depois apareceram 2 pessoas pra ajudar, mas elas nao tem tido mto tempo pra mexer atualmente.

Preciso que vc se cadastre na sourceforge me passe o seu id.

Seguinte... eu vinha pensando numa forma de facilitar as buscas... mas pensei em algo um pouco diferente, já que da forma que vc escreveu acabamos limitando a apenas operadores "==". Tinha pensado em algo assim:

$q = new SuperHiperUltraMegaQueryGenerator(); //Hhahau. depois pensamos em um nome.
$q->addClause( 'id', '==', 1);
$q->addClause( 'birthday', '>', '1980-02-01' );
$q->eagerload( 'groups->group' );
$q->limit( 30 );
$q->getList(); // Ou $q->get, $q->count, $q->getIterator

Desta forma fica mais facil de ler o codigo de listagem. Aguardo sugestoes.

[]s,
Snit

2009/10/10 ( David . RJ . 2K ) <davi...@gmail.com>

André Farzat

unread,
Oct 11, 2009, 1:53:16 PM10/11/09
to sqlreact...@googlegroups.com
pq não:

$q = SQLReactor::Filter( 'NomeDaTabela' );
$q->addClause( 'nomeDaColuna', '==',  'someome' );
$q->doMiracle(); // o get ou o getList ou o getIterator

// ou pode colocar o nome da tabela no getList('User') por exemplo


?

2009/10/11 Rafael Martins <snit...@gmail.com>



--
André de Almeida Farzat
andre...@gmail.com

( David . RJ . 2K )

unread,
Oct 11, 2009, 2:26:05 PM10/11/09
to SQLReactor Brasil
Talvez:

$user = new User();
// Vamos supor que eu queira pegar todos usuários que tenham mais que
2 emails cadastrados:
$user->mailcount = array('>', 2); // ou, como é um caso simples:
$user->mailcount = array('> 2);
// Poderiamos limitar filtro
$user->limit(5); // Obter apenas 5 ou
$user->limit(5, 5); // Obter 5 no offset 5 ou diretamente ou
$user->limitOffset(5); // configurar o offset separadamente (casos
raros, mas pode existir)
// Por fim, finalizar a consulta:
$user->get();

Estava pensando na possibilidade de transformar $user->variavel em um
objeto (poderia ser SQLReactorVariable), no qual ofereceria as opções
sem confundir a IDE ou a documentação.
$user->mailcount is_subclass_of SQLReactorVariable
$user->mailcount = 2; // Básico, == 2 ou
$user->mailcount = '> 2'; // Básico especial > 2 ou
$user->mailcount = array('<', 2); // Avançado < 2 ou, para dar
utilidade ao SQLReactorVariable:

$user->mailcount->method = ">=";
$user->mailcount = 2; // Modelo básico (>= 2) ou
$user->mailcount->value = 2; // Mesma coisa que o de cima, só que
explícito

Porém, creio que este segundo parágrafo só seja funcional no PHP
5.3 :S mas não tenho certeza.

Valeu!

PS: Meu id no Sourceforge é david71rj.
Pergunta: se eu responder direto pelo meu email, o groups vai enviar
pra cá também? :) da trabalho vir até aki aushsauhsa

On 11 out, 14:53, André Farzat <andrefar...@gmail.com> wrote:
> pq não:
>
> $q = SQLReactor::Filter( 'NomeDaTabela' );
> $q->addClause( 'nomeDaColuna', '==',  'someome' );
> $q->doMiracle(); // o get ou o getList ou o getIterator
>
> // ou pode colocar o nome da tabela no getList('User') por exemplo
>
> ?
>
> 2009/10/11 Rafael Martins <snit....@gmail.com>
>
>
>
>
>
> > Uau.
> > Passei um dia fora e vc ja mandou milhares de coisas pra lista. Ja que está
> > tão empolgado e já está tão por dentro, vou disponibilizar acesso pra vc no
> > svn do projeto na sourceforge. Fiz basicamente sozinho mas depois apareceram
> > 2 pessoas pra ajudar, mas elas nao tem tido mto tempo pra mexer atualmente.
>
> > Preciso que vc se cadastre na sourceforge me passe o seu id.
>
> > Seguinte... eu vinha pensando numa forma de facilitar as buscas... mas
> > pensei em algo um pouco diferente, já que da forma que vc escreveu acabamos
> > limitando a apenas operadores "==". Tinha pensado em algo assim:
>
> > $q = new SuperHiperUltraMegaQueryGenerator(); //Hhahau. depois pensamos em
> > um nome.
> > $q->addClause( 'id', '==', 1);
> > $q->addClause( 'birthday', '>', '1980-02-01' );
> > $q->eagerload( 'groups->group' );
> > $q->limit( 30 );
> > $q->getList(); // Ou $q->get, $q->count, $q->getIterator
>
> > Desta forma fica mais facil de ler o codigo de listagem. Aguardo sugestoes.
>
> > []s,
> > Snit
>
> > 2009/10/10 ( David . RJ . 2K ) <david7...@gmail.com>
> andrefar...@gmail.com

André Farzat

unread,
Oct 11, 2009, 2:51:12 PM10/11/09
to sqlreact...@googlegroups.com
ai ta começando a complicar as coisas.

Pq será necessário criar cada atributo/metodo pra cada coluna ... ouch ...
e a classe User é para manipular os dados do db.

ainda acho melhor que fique apenas filtragem por id pela propria classe
ex:

$u = new User( 10 ); // pega o usuario de id 10
$u->getName(); //pega o nome do coidato

e haver uma outra maneira de buscar dados como citei anteriormente.
Se ficar na mesma classe que manipula os dados ficará muito confuso e misturado.

obs:
se existir uma coluna chamada 'mailcount' ficaria 'mailcountcount' ? =P



2009/10/11 ( David . RJ . 2K ) <davi...@gmail.com>
andre...@gmail.com

David S. Rodrigues

unread,
Oct 11, 2009, 2:56:46 PM10/11/09
to sqlreact...@googlegroups.com
É, realmente, ficaria complicado.

Mas acho que bons tutoriais ajudariam, o que não é complicado?
Para se add novos recursos tem que complicar :p

Mas tem que ser planejado antes, se não ai vira bagunça (a La Microsoft)
aushsuahas

vlw!

2009/10/11 André Farzat <andre...@gmail.com>



--
David S. Rodrigues

Silas Ribas Martins

unread,
Oct 13, 2009, 3:50:03 PM10/13/09
to sqlreact...@googlegroups.com
Salve,

Eu acho melhor separar Entidade da Busca, se não vai ter gente mudando dados quando vai tentar fazer a busca. A idéia do Snit.ram é bem legal...mas acho que está bom o uso estático da coisa.

Valeu!

2009/10/11 David S. Rodrigues <davi...@gmail.com>



--
Atenciosamente (=Ô.Ô=),
Silas Ribas {Maximus_BR}

71 8892-6095 ( Celular ) silasrm[arroba]gmail.com ( e-mail )
sil...@hotmail.com ( msn ) silasrm ( skype )

Twitter: @silasribas
Blog:silas.theducks.com.br
Site: www.silasribas.com.br
LinkedIn: http://www.linkedin.com/in/silasrm
Facebook: http://www.facebook.com/silasribas
Orkut: http://www.orkut.com.br/Main#Profile.aspx?rl=ls&uid=3392300346524829647
Salvador/BA
Linux Distro - *Ubuntu
Linux User Registered: 383742

"Triste época em que vivemos, onde é mais fácil desintegrar um átomo do que quebrar um preconceito" [Albert Einstein]
Reply all
Reply to author
Forward
0 new messages