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

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

O código acima retornará um vetor de instâncias de Post. Diferente <strong>do</strong> lazy loading, a<br />

propriedade authorde cada instância de Post já está preenchida com a instância de User<br />

relacionada, antes de acessarmos a propriedade. Em vez de executar uma consulta de<br />

junção para cada post, a técnica de eager loading traz to<strong>do</strong>s os posts, junto com seus<br />

autores, em uma única consulta.<br />

Podemos especificar o nome de múltiplos relacionamentos na chamada <strong>do</strong> méto<strong>do</strong> with()<br />

e o eager loading se encarregará de traze-los to<strong>do</strong>s de uma só vez. Por exemplo, o<br />

código a seguir irá recuperar to<strong>do</strong>s os posts, juntos com seus autores e suas categorias:<br />

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

Podemos também fazer eager loadings aninha<strong>do</strong>s. Em vez de uma lista com nomes de<br />

relacionamentos, podemos passar uma representação hierárquica de nomes de<br />

relacionamentos para o méto<strong>do</strong> with(), como no exemplo a seguir:<br />

$posts=Post::model()->with(<br />

'author.profile',<br />

'author.posts',<br />

'categories')->findAll();<br />

O exemplo acima irá recuperar to<strong>do</strong>s os posts, junto com seus autores e suas categorias.<br />

Ele trará também o perfil de cada autor e seus posts.<br />

Nota: O uso <strong>do</strong> méto<strong>do</strong> with() foi altera<strong>do</strong> a partir da versão 1.0.2. Por favor, leia a<br />

<strong>do</strong>cumentação correspondente cuida<strong>do</strong>samente.<br />

A implementação <strong>do</strong> AR no <strong>Yii</strong> é bastante eficiente. Quan<strong>do</strong> utilizamos eager loading para<br />

carregar uma hierarquia de objetos relaciona<strong>do</strong>s envolven<strong>do</strong> N relacionamentos <strong>do</strong> tipo<br />

HAS_MANY e MANY_MANY, serão necessárias N+1 consultas SQL para obter os<br />

resulta<strong>do</strong>s necessários. Isso significa que serão executadas 3 consultas SQL no último<br />

exemplo, por causa das propriedade posts e categories. Outros frameworks preferem uma<br />

técnica mais radical, utilizan<strong>do</strong> somente uma consulta. A primeira vista, essa técnica<br />

parece mais eficiente porque menos consultas estão sen<strong>do</strong> executadas pelo banco de<br />

da<strong>do</strong>s. Mas nas realidade, isso é impraticável por duas razões. Primeira, existem muitas<br />

colunas com da<strong>do</strong>s repeti<strong>do</strong>s nos resulta<strong>do</strong>s, que precisam de mais tempo para serem<br />

transmiti<strong>do</strong>s e processa<strong>do</strong>s. Segunda, o número de registros em um resulta<strong>do</strong> cresce<br />

exponencialmente de acor<strong>do</strong> com o número de tabelas envolvidas, de forma a ficarem<br />

simplesmente intratáveis quanto mais relacionamentos estão envolvi<strong>do</strong>s.<br />

A partir da versão 1.0.2, você também pode forçar que a consulta relacional seja feita com<br />

uma única consulta SQL. Simplesmente adicione uma chamada ao méto<strong>do</strong> together()<br />

depois <strong>do</strong> méto<strong>do</strong> with(). Por exemplo:

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

Saved successfully!

Ooh no, something went wrong!