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.

Informação: Uma chave estrangeira pode ser composta, consistin<strong>do</strong> de duas ou mais<br />

colunas. Nesse caso, devemos concatenar os nomes das colunas da chave<br />

estrangeira e separa-los por um espaço ou uma vírgula. Para relacionamentos <strong>do</strong> tipo<br />

MANY_MANY, a tabela associativa também deve ser especificada na chave<br />

estrangeira. Por exemplo, o relacionamento categories em Post é especifica<strong>do</strong> com a<br />

chave estrangeira PostCategory(postID, categoryID).<br />

A declaração de relacionamentos em uma classe AR adiciona, implicitamente, uma<br />

propriedade para cada relacionamento declara<strong>do</strong>. Depois que a consulta relacional for<br />

executada, a propriedade correspondente será preenchida com as instâncias AR<br />

relacionadas. Por exemplo, se $author representa uma instância de User, podemos<br />

utilizar $author->posts para acessar as instâncias de seus Post relaciona<strong>do</strong>s.<br />

Executan<strong>do</strong> Consultas Relacionais<br />

A maneira mais simples de executar uma consulta relacional é acessar uma propriedade<br />

relacional em uma instância AR. Se a propriedade não foi acessada antes, uma consulta<br />

relacional será iniciada, que irá unir as duas tabelas relacionadas e filtra-las pela chave<br />

primária da instância. O resulta<strong>do</strong> da consulta será armazena<strong>do</strong> na propriedade como<br />

instância(s) da classe AR relacionada. Essa técnica é conhecida por delazy loading<br />

(carregamento retarda<strong>do</strong>). Ou seja, a pesquisa relacional é executada somente quan<strong>do</strong><br />

os objetos relaciona<strong>do</strong>s são acessa<strong>do</strong>s. O exemplo abaixo mostra como utilizar essa<br />

técnica:<br />

// recupera post com ID 10<br />

$post=Post::model()->findByPk(10);<br />

// recupera o autor <strong>do</strong> post. Uma consulta relacional será executada aqui<br />

$author=$post->author;<br />

Informação: Se não existirem instâncias para um relacionamento, a propriedade<br />

correspondente poderá ser null ou um vetor vazio. Para relacionamentos <strong>do</strong> tipo<br />

BELONGS_TO e HAS_ONE, o retorno é null; para HAS_MANY e MANY_MANY, o<br />

retorno é um vetor vazio. Note que HAS_MANY e MANY_MANY retornam um vetor de<br />

objetos. Sen<strong>do</strong> assim, você precisará primeiro acessar seus elementos para acessar<br />

suas propriedades. Caso contrário, você poderá gerar o erro "Trying to get property of<br />

non-object".<br />

A técnica <strong>do</strong> lazy loading é bastante conveniente, mas não é eficiente em alguns cenários.<br />

Por exemplo, se queremos acessar informações <strong>do</strong> autor para N posts, a utilização de<br />

lazy loading irá executar N consultas. Nessas circunstâncias devemos recorrer a técnica<br />

de eager loading.<br />

Nessa técnica, recuperamos as instâncias AR relacionadas junto com a instância AR<br />

principal. Isso é feito utilizan<strong>do</strong>-se o méto<strong>do</strong> with(), junto com um <strong>do</strong>s méto<strong>do</strong>s find ou<br />

findAll. Por exemplo:<br />

$posts=Post::model()->with('author')->findAll();

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

Saved successfully!

Ooh no, something went wrong!