Yii – Personalizando as consultas.

Se você reparou nos códigos dos artigos anteriores, o Yii possui diversas formas de fazer consultas. Nesse último artigo do tutorial irei mostrar algumas delas, e como você poderá usá-las.

Usando os métodos da classe CActiveRecord
A classe CactiveRecord é a base de nossos models, que são classes representativas das  tabelas de nossos bancos de dados. Seus métodos de busca permitem que busquemos tanto resultados múltiplos quanto resultados únicos. O método mais utilizado é o findByPk(), que retorna um registro, usando como parâmetro a chave primária da tabela.

Por exemplo, na maioria dos controllers gerados pelo Gii, temos um método chamado loadModel($id), que internamente faz uso do findByPk(). Tomemos por exemplo o método loadModel do controller Usuarios:

public function loadModel($id)
{
 $model=Usuarios::model()->findByPk($id);
 if($model===null)
  throw new CHttpException(404,'The requested page does not exist.');
 return $model;
}

A linha 151 faz com que uma variável  chamada $model seja preenchida com o resultado da consulta pela variável $id. Se não existir um registro cuja chave primária tenha esse valor, a variável recebe null

Outros métodos bastante utilizados são o find() e o findAll(). A diferença entre os dois é que o find() retorna apenas um resultado, enquanto o findAll() retorna todos aqueles que cumprirem com nossos critérios de busca. Mas como defninimos esses critérios?

A chamada do método find() é feita assim: $seumodelo->find(mixed $condition=”, array $params=array( )).No primeiro parâmetro, $condition, passamos o “where”. No segundo, $params, passamos um array com os valores dos parâmetros. Por exemplo, vamos procurar na tabela de usuários aquele que tem o nome de ‘Admin’. A chamada pode ser feita assim:

$cond = 'nome=:varnome';
$parametros = array();
$parametros[':varnome']='Admin';
$usr = Usuarios::model()->find($cond,$parametros);

Como você deve ter percebido, passamos os nomes dos parâmetros no formato :nome, tanto no código da condição quanto no array. Você pode definir múltiplos parâmetros e condições, acrescentando os and e or necessários.
Porém, em certos momentos, passar os parâmetros dessa forma pode ficar um pouco limitador. Para isso existe então a classe CDBCriteria. Essa classe permite que possamos definir várias condições e parâmetros, além de outras informações, como a ordem das buscas, fazer joins, etc. Por exemplo, digamos que, além de buscarmos um usuário cujo nome seja ‘Admin’, queremos trazer também aquele(s) que o id seja 1:

$criteria = new CDbCriteria;
$criteria->compare('nome','Admin);
$criteria->compare('id',1);
$usu = Usuarios::model()->find($criteria);

Perceba que simplesmente passamos nosso objeto $criteria como parâmetro do métodod find().
Veja também que não utilizei os parâmetros aqui, mas sim o método compare(). embora podería ter usado as propriedades condition e params da classe CdbCriteria. Para mais detalhes sobre o método compare(), consulte a documentação.

A classe CActiveRecord possui ainda outros métodos para busca. Estude-os.

CActiveDataProvider
A classe CActiveDataProvider é uma classe de pesquisa de dados que utiliza as classes ActiveRecord (ou seja, models) criadas por você. Geralmente ela é utilizada como fonte de dados de widgets, tais como a CGridView e a CListView. Uma das vantagens de se utilizar essa classe é que ela já provê para nós a paginação e a ordenação dos resultados. Veja por exemplo, a action index de nosso controller:

public function actionIndex()
{
 $dataProvider=new CActiveDataProvider('Usuarios');
 $this->render('index',array(
  'dataProvider'=>$dataProvider,
 ));
}

A linha 121 gera o objeto CActiveDataProvider que será utilizado pelo widget declarado em nossa view. Da mesma forma que fizemos no método find() da classe CActiveRecord, podemos personalizar a busca pelos resultados, utilizando novamente a classe CDbCriteria:

 $crit = new CDbCriteria;
 $crit->compare('nome','Admin);
 $crit->compare('id',1);  

 $dataProvider=new CActiveDataProvider('Usuarios', array(
  'criteria'=>$crit,
  'pagination'=>array(
   'pageSize'=>50,
  ),
 ));

Aqui, passamos como primeiro parâmetro o nome do model que queremos pesquisar (‘Usuarios’). Já o segundo parâmetro é um array com as opções  da CActiveDataProvider. Fazemos com que ela utilize nosso objeto $crit como parâmetro para a pesquisa, e também definimos que cada página de dados tenha 50 registros.

Esse artigo foi menor, mas acredito que tenha dado uma base para entender como fazer consultas de dados utilizando os recursos do Yii. Existem ainda n outras classes para isso (*DataProvider), além de você mesmo ter o poder de criar as suas. Para saber mais, consulte sempre a documentação.

Espero que esse tutorial (que chegou ao fim hoje) possa ter-lhe ajudado a trabalhar melhor com o Yii. Qualquer dúvida, e estando ao meu alcance, estou à disposição.