Ayuda con una consulta en Yii

Buenas, soy practicamente nuevo en Yii. y estoy tratando de hacer una llevar una gran consulta SQL a Yii, para generar una vista pero tengo muchas dudas acerca de; si me podrian guiar seria de gran ayuda:

esta es la consulta que tengo:

$consulta=Nphojint::model()->findBySql(

	'SELECT A.*,to_char(m.fecinienc,\'05/10/2016\') as fechaenc 


						FROM ( 


							SELECT "SIMA010".fc_ultimo_cargo(a.codemp,\'05/10/2016\') AS nomcar, 


								a.nacemp AS nacemp, 


								a.codemp AS codemp, 


								a.cedemp AS cedemp,


								a.nomemp AS nomemp,


								c.codnom AS codnom, 


								f.tipnom AS tipnom, 


								f.conemp AS conemp, 


								c.nomnom AS nomnom, 


								e.suecar AS sueldocargo, 


								(e.suecar*12) AS sueldocargoanual, 


								coalesce((SELECT b.suecar AS suecarenc 


								FROM "SIMA010".nphojint a, "SIMA010".npcargos b 


								WHERE trim(a.codcarenc) = trim(b.codcar) AND trim(a.codemp) = trim(\'0381\')),0) AS suecarenc, 


								coalesce((SELECT (b.suecar*12) AS suecarencanual 


								FROM "SIMA010".nphojint a, "SIMA010".npcargos b 


								WHERE trim(a.codcarenc) = trim(b.codcar) AND trim(a.codemp) = trim(\'0381\')),0) AS suecarencanual, 


								(SELECT coalesce((unitrib*3),0) AS primahogar 


								FROM "SIMA010".npdefgen ) AS primahogar, 


								coalesce((SELECT coalesce((a.unitrib*4),0) AS primamerito 


								FROM "SIMA010".npdefgen a, "SIMA010".npasiconemp b 


								WHERE b.codcon = \'005\' and trim(b.codemp) = trim(\'0381\')),0) AS primamerito, 


								coalesce((SELECT (b.monto*2) AS primarespon 


								FROM "SIMA010".npasiconemp b 


								WHERE b.codcon = \'072\' and trim(b.codemp) = trim(\'0381\')),0) AS primarespon,


								(SELECT coalesce((a.unitrib*9),0) AS primatrans 


								FROM "SIMA010".npdefgen a, "SIMA010".npasiconemp b 


								WHERE b.codcon = \'064\' and trim(b.codemp) = trim(\'0381\')) AS primatrans, 


								(SELECT coalesce(sum((a.unitrib*1.5)),0) AS primahijos 


								FROM "SIMA010".npdefgen a, "SIMA010".npasiconemp b, "SIMA010".npinffam c 


								WHERE trim(b.codemp) = trim(c.codemp) and b.codcon = \'004\' and trim(b.codemp) = trim(\'0381\') and EXTRACT(YEAR FROM(age(c.fecnac))) < \'19\' ) AS primahijos, 


								(SELECT coalesce(sum(monto),0) AS primasantyprof 


								FROM "SIMA010".npasiconemp 


								WHERE trim(codemp) = trim(\'0381\') AND codcon in (\'062\',\'063\')) AS primasantyprof,


								(SELECT coalesce(sum(monto),0) AS compensacionsalarial


								FROM "SIMA010".npasiconemp 


								WHERE trim(codemp) = trim(\'0381\') AND codcon in (\'084\',\'086\')) AS compensacionsalarial,


								(SELECT ((unitrib * 1.5)*30) AS cestaticket 


								FROM "SIMA010".npdefgen) AS cestaticket, 


								(SELECT (((unitrib * 1.5)*30)*12) AS cestaticketanual 


								FROM "SIMA010".npdefgen) AS cestaticketanual, 


								(SELECT valor1 AS subvencion 


								FROM "SIMA010".npdefvar 


								WHERE TRIM(codvar) = \'SVA\') AS subvencion, 


								(SELECT (valor1*12) AS subvencionanual 


								FROM "SIMA010".npdefvar 


								WHERE TRIM(codvar) = \'SVA\') AS subvencionanual, 


								(e.suecar*2) AS bonincahoanual, 


								coalesce((SELECT (b.suecar*2) AS bonincahoanualenc 


								FROM "SIMA010".nphojint a, "SIMA010".npcargos b 


								WHERE trim(a.codcarenc) = trim(b.codcar) AND trim(a.codemp) = trim(\'0381\')),0) AS bonincahoanualenc, 


								((e.suecar/30)*45) AS bonoperma, 


								coalesce((SELECT ((b.suecar/30)*45) AS bonopermaenc 


								FROM "SIMA010".nphojint a, "SIMA010".npcargos b 


								WHERE trim(a.codcarenc) = trim(b.codcar) AND trim(a.codemp) = trim(\'0381\')),0) AS bonopermaenc, 


								(((e.suecar/30)*45)*2) AS bonopermaanual, 


								coalesce((SELECT (((b.suecar/30)*45)*2) AS bonopermaanualenc 


								FROM "SIMA010".nphojint a, "SIMA010".npcargos b 


								WHERE trim(a.codcarenc) = trim(b.codcar) AND trim(a.codemp) = trim(\'0381\')),0) AS bonopermaanualenc, 


								(to_char(a.fecing,\'05/10/2016\')) AS fecing, 


								a.fecing AS fecing2, 


								"SIMA010".fc_cargo_encargado(trim(\'0381\'),\'05/10/2016\') AS nomcarenc, 


								a.staenc AS staenc, 


								b.desniv AS desniv 


							FROM "SIMA010".nphojint a, "SIMA010".npestorg b , "SIMA010".npasicaremp c, "SIMA010".npcargos e, "SIMA010".npnomina f 


							WHERE trim(a.codemp) = trim(\'0381\') 


							and trim(a.codemp) = trim(c.codemp) 


							and trim(a.codniv) = trim(b.codniv) 


							and trim(c.codcar) = trim(e.codcar) 


							and trim(c.codnom) = trim(f.codnom) 


							GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35 ) AS A 


						LEFT JOIN "SIMA010".nphisenc m ON trim(A.codemp) = trim(m.codemp) 


						GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36'


	);

tengo una relacion en el modelo Nphojint:

‘relacion’=>array(self::HAS_ONE,‘Npasicaremp’,‘codemp’),

cuando voy a mostrarlo en la vista:

 echo $consulta->codemp;


 echo $consulta->relacion->codemp;

Me arroja el siguiente error:

Invalid argument supplied for foreach()

{


     // determine the primary key value


   if(is_string($this->_pkAlias))  // single key


    {


         if(isset($row[$this->_pkAlias]))


             $pk=$row[$this->_pkAlias];


         else    // no matching related objects


             return null;


     }


     else // is_array, composite key


     {


         $pk=array();


         foreach($this->_pkAlias as $name=>$alias)


         {


             if(isset($row[$alias]))


                 $pk[$name]=$row[$alias];


             else    // no matching related objects


                 return null;


         }


         $pk=serialize($pk);


     }





     // retrieve or populate the record according to the primary key value


     if(isset($this->records[$pk]))


         $record=$this->records[$pk];

María santisma

Amigo ese error no se donde se origina pero se que se da porque no le estas pasando un argumento valido al foreach

tiene que ser un Id o un campo que sea finito y que te sirva para la consulta generalmente; si necesitas una mejor respuesta tienes que aprender a formular bien la pregunta trata de que tus consultas no se vuelvan tan largas porque serian inmanejables o en este caso ilegibles, y por dios trata de que los campos en la base de datos comuniquen algo por que si nombras campos como nphojint nadie va a entender lo que tratas de conseguir asi que en este caso puntual muestra mejor las tablas y sus relaciones y expresa lo que necesitas conseguir.

Saludos desde Colombia.

Postdata: Yo también soy nuevo en yii :D

Virgen Santa!

En primer lugar decirte que si necesitas una consulta como esa…igual tienes que revisar el diseño de tu base de datos.

Y en segundo lugar, sabes que si la base de datos está bien diseñada y cargas un modelo, automáticamente tienes todos los datos relacionados? A mi modo de ver es imposible que te haga falta una consulta como esa.

Pq no nos dices que es lo que necesitas recuperar y nos muestras las tablas a utilizar?

Un saludo.