O Guia Definitivo do Yii 1.1
O Guia Definitivo do Yii 1.1
O Guia Definitivo do Yii 1.1
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: