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.
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();