Exibição de Dados de Tabelas Relacionadas

E ai galera, sou novo no Yii e estou com um problema que vcs talvez possam me ajudar.

seguinte, tenho duas views: ‘vw_mat_empregado’ e ‘gop_mee_smmateqe’, onde a primeira tem os dados dos funcionarios e a segunda os materiais fornecidos a funcionarios.

As tabelas devem se relacionar da seguinte maneira:

vw_mat_empregado -> nr_rg = matricula_funconario <- gop_mee_smmateqe

segui o tutorial do yii e realizei o relacionamento entre as classes, como segue no trecho abaixo

VmMatEmpregado.php




public function relations()

	{

		// NOTE: you may need to adjust the relation name and the related

		// class name for the relations automatically generated below.

		return array(

			'materiais'=>array(self::HAS_MANY, 'GopMeeSmmateqe', 'matricula_funcionario'),

		);

	}




public function primaryKey()

	{

	    return 'nr_rg';

	}



porém quando executo a consulta na view, não recebo todos os dados que existem na tabela, normalmente apenas um deles (e estou usando findAll):

index.php




$criteria = new CDbCriteria;

$criteria->condition = 'nr_rg=:nr_rg';

$criteria->params = array(':nr_rg'=>41495);

$teste = VwMatEmpregado::model()->with('materiais')->together()->findAll($criteria);

	

var_dump($teste);




o detalhe é que se insiro a query gerada pelo log no pgAdmin ele me traz corretamente os resultados.

Estou fazendo algo errado?

Obrigado a todos …

Ricardo,

Ta correto o que está fazendo, vamos pegar seu exemplo


$teste = VwMatEmpregado::model()->with('materiais')->together()->findAll($criteria);



Se deseja pegar os itens do relacionamento ‘materiais’, usa-se assim


$teste->materiais->seuatributo

Newerton obrigado pela respota!

Então se eu faço:




var_dump($teste->materiais)



ele me exibe somente um dos registros disponiveis, sendo que a query gerada no log, quando executada no pg admin me traz cerca de 10 registros …

realmente não estou entendendo o que acontece …

Ricardo,

Posta a query que está sendo executada.

Depois faz um teste, remove o together() da query, e veja novamente pelo var_dump() se retorna os 10 registro.

Eu não sei se por padrão o together() seta como ‘true’, se for setado como ‘true’, a query da junção muda para INNER JOIN ao invez de LEFT JOIN.

Se na relação está HAS_MANY o correto seria LEFT JOIN.

Tentei tirar o together() … a query permanece a mesma, e o resultado tbm:

segue a query:




SELECT "t"."nr_rg" AS "t0_c0", "t"."nm_empregado" AS "t0_c1",

"t"."nm_guerra" AS "t0_c2", "t"."situacao_funcionario" AS "t0_c3",

"t"."cargo" AS "t0_c4", "t"."descricao_cargo" AS "t0_c5",

"t"."descricao_abreviada_cargo" AS "t0_c6", "t"."nr_rs" AS "t0_c7",

"t"."descricao_centro_custo" AS "t0_c8", "t"."sigla_centro_custo" AS

"t0_c9", "materiais"."cdmatmcd" AS "t1_c0", "materiais"."nmmcd" AS

"t1_c1", "materiais"."matricula_funcionario" AS "t1_c2",

"materiais"."nome" AS "t1_c3", "materiais"."cdcautqem" AS "t1_c4",

"materiais"."qtoriqem" AS "t1_c5", "materiais"."qtqeqem" AS "t1_c6",

"materiais"."nralmqem" AS "t1_c7", "materiais"."nrdocqem" AS "t1_c8",

"materiais"."dtdocqem" AS "t1_c9" FROM "gop_mee"."vw_mat_empregado" "t" 

LEFT OUTER JOIN "gop_mee"."gop_mee_smmateqe" "materiais" ON

("materiais"."matricula_funcionario"="t"."nr_rg")  WHERE (nr_rg=:nr_rg)



na teoria o que estou fazendo estaria certo? tenho uma tabela de funcionarios e os materiais destinados a cada um desses funcionarios … dessa forma tenho um relacionamento 1 para muitos, ok?

então, ao consultar um funcionario através desse relacionamento eu deveria ter acesso a um array dos materiais através de




$teste->materiais



seria isso mesmo ou estou viajando? rs …

PS: editei esse post, pois notei que acontece a mesma coisa em uma outra busca que fiz … olha só fiz uma busca por setor, trouxe todos os usuarios … até ai blz. Porém para cada usuario aparece no maximo 1 material, sendo que alguns possuem mais que isso …

Faz um teste ae:




$criteria = new CDbCriteria;

$criteria->condition = 'nr_rg=:nr_rg';

$criteria->params = array(':nr_rg'=>41495);

$teste = VwMatEmpregado::model()->with('materiais')->findAll($criteria);


foreach($teste as $value){

	echo $value->materiais->nome.'<br />';

}



Assim ele lista todos os itens da tabela ‘“gop_mee”.“gop_mee_smmateqe” “materiais”’

Cara … descobri o que estava acontecendo … acabei colocando como chave primaria um registro que estava se repetindo e por algum motivo o Yii não traz essa informação com chave repetida …

solução criei um outro campo auto increment e defini como chave primaria … agora esta belezinha :lol:

Newerton … muito obrigado pela ajuda!!!

abração …