20.11.2014 Views

O Guia Definitivo do Yii 1.1

O Guia Definitivo do Yii 1.1

O Guia Definitivo do Yii 1.1

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

class Post extends CActiveRecord<br />

{<br />

public function relations()<br />

{<br />

return array(<br />

'commentCount'=>array(self::STAT, 'Comment', 'postID'),<br />

'categoryCount'=>array(self::STAT, 'Category', 'PostCategory<br />

(postID, categoryID)'),<br />

);<br />

}<br />

}<br />

No código acima, declaramos duas consultas estatísticas: commentCount, que calcula o<br />

número de comentários em um post e categoryCount, que calcula o número de categorias<br />

a quem um post pertence. Note que o relacionamento entre Post e Comment é <strong>do</strong> tipo<br />

HAS_MANY, enquanto o relacionamento entrePost e Category é MANY_MANY (com a<br />

tabela associativa PostCategory). Como podemos ver a declaração é bastante similar a<br />

das relações descritas anteriormente. A única diferença é que o tipo de relação agora é<br />

STAT.<br />

Com a declaração acima, podemos recuperar o número de comentários para um post<br />

acessan<strong>do</strong> a propriedade $post->commentCount. Ao acessá-la pela primeira vez, uma<br />

instrução SQL será executada, implicitamente, para retornar o resulta<strong>do</strong> correspondente.<br />

Como já sabemos, essa técnica é chamada de lazy loading. Também podemos utilizar a<br />

técnica eager loading se precisarmos determinar a quantidade de comentários para vários<br />

posts.<br />

$posts=Post::model()->with('commentCount', 'categoryCount')->findAll();<br />

O código acima irá executar três instruções SQL para retornar to<strong>do</strong>s os posts juntamente<br />

com a quantidade de comentários e categorias em cada um deles. Utilizan<strong>do</strong> lazy loading,<br />

acabaríamos executan<strong>do</strong> 2*N+1instruções SQL, se existirem N posts.<br />

Por padrão, uma consulta estatística utiliza a expressão COUNT para calcular os<br />

resulta<strong>do</strong>s. Podemos personaliza-la especifican<strong>do</strong> opções adicionais, no méto<strong>do</strong> relations<br />

(). As opções disponíveis estão resumidas abaixo:<br />

• select: a expressão estatística. Por padrão é COUNT(*), que contará to<strong>do</strong>s os<br />

objetos.<br />

• defaultValue: o valor a ser atribuí<strong>do</strong> aos registros que não receberem um resulta<strong>do</strong><br />

em uma consulta estatística. Por exemplo, se um post não tiver comentários, o valor<br />

de commentCount será o especifica<strong>do</strong> nesta propriedade. Por padrão, seu valor é 0.<br />

• condition: representa a cláusula WHERE. Não tem nenhum valor por padrão.<br />

• params: representa os parâmetros que devem ser vincula<strong>do</strong>s na instrução SQL<br />

gerada.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!