Llevo 2 semanas usando Yii y no tengo mucha experiencia aun.
Estoy haciendo un proyecto de final de curso de 2º DAI.
Una INTRANET centrada en la gestión de protocolos así como los distintos trabajo apartir de dichos protocolos.
Como tengo distintos roles, y cada empleado podra ver distintas cosas. Las Select´s se me quedan
en cierta medida complejas.
$sql = "SELECT * FROM PROTO WHERE ORIGEN IN(SELECT IDTYPETRABAJO FROM IDJALON
WHERE IDEPT =".Yii::app()->user->getState("dept").")
AND TIPO='T' AND estadototal = (SELECT FASE FROM TYPEJALON
WHERE IDTYPETRABAJO = PROTO.ORIGEN
AND DEPT = ".Yii::app()->user->getState("dept").")";
[size="2"]*sql sin testear[/size]
Claro no tengo mucha idea del Yii
y me monto los DataProvider a pedal xDDD
$sq = "FROM `typetrabajo` WHERE `idtypetrabajo` in (select `idtypetrabajo` from deptassig where idDept =".Yii::app()->user->getState("dept").")";
$count=Yii::app()->db->createCommand("SELECT COUNT(*) ".$sq)->queryScalar();
//$count =2;
$sql='SELECT idtypetrabajo , nombre , descrip '.$sq;
//echo $sql ;
//die;
$dataProvider=new CSqlDataProvider($sql, array(
'totalItemCount'=>$count,
'sort'=>array(
'attributes'=>array(
'idtypetrabajo', 'nombre', 'descrip',
),
),
'pagination'=>array(
'pageSize'=>5,
),
));
A tu código que ando viendo, no estas ejecutando el sql estan haciendo referencia a esa cadena de sql, pero te falta ejecutarlo con execute() osea:
//Tu lo indicas de esta manera:
$count=Yii::app()->db->createCommand("SELECT COUNT(*) ".$sq)->queryScalar()
//Te falta ejecutarlo al final
$count=Yii::app()->db->createCommand("SELECT COUNT(*) ".$sq)->queryScalar()->execute()
//No he probado eso del queryScalar pero tu nada mas estas indicando tu sql con las instrucciones propias de YII que es correcto, pero despues de indicarlo debes de ejecutar tu sentencia SQL espero me haya dado a entender...
En lo particular te recomiendo que los hagas de esta manera a mi se me hace mas fácil y esta mucho mejor usando mas el frame:
Si analizas el código es de una manera mas fácil de realizarlo utilizando el propio frame, solo pones tus id, tu tabla, le dices que quieres obtener en especifico en el where en base a una arreglo lo obtienes si te fijas pongo un array luego del where y ya al final le indico el sql que necesito de esta manera ya me mostro mi sql que necesito y me muestra el arreglo de los datos $model es el objeto al cuál tu haras referencia osea imaginatelo:
array(':id_perfil'=>1)
// o en vez de un 1 pon un 2 aki yo lo ando comparando con mi ID esta forma es correcta y es funcional.
La manera en la que me preguntas no la he estudiado… ya que también soy novato, pero estuve leyendo en el mismo foro y para una consulta mas en especifico vi que la realizan de esta manera:
Yii::app()->db->createCommand($sql)->query();
Y a lo que dicen en los foros ps si es comprensible y logico solo que tengas cuidado con los alias.
SELECT
p.COMMENTS, v.COMMENTS
FROM PRODUCTS p
LEFT OUTER JOIN VENDOR v ON v.VEN_UID = p.VEN_ID
SELECT
PRODUCTS.COMMENTS AS COMMENTS_1, VENDOR.COMMENTS AS COMMENTS_2
FROM PRODUCTS
LEFT OUTER JOIN VENDOR ON VENDOR.VEN_UID = PRODUCTS.VEN_ID
SELECT
PRODUCTS.COMMENTS AS COMMENTS_1, VENDOR.COMMENTS AS COMMENTS_2
FROM PRODUCTS
LEFT OUTER JOIN VENDOR ON VENDOR.VEN_UID = PRODUCTS.VEN_ID
Te indique diferentes maneras en las cuales meterias dentro de tu variable $sql, nada mas sería cuestión de que las estudies de la otra manera en la que te lo indique la verdad no tengo idea aún de como hacerlo aunque lo he estado buscando… Saludos.
Alguien tiene idea de como imprimir eso en la vista…como quedarían los tres archivos, el del modelo, la vista y el controlador una vez ejecutada la consulta???
Hola, por si a alguien le sirve, ya que estuve buscando esto mismo y ya lo pude hacer, tomando código de distintos lugares:
Modelo (Liquidacion, este es el nombre de mi modelo)
public function liquidar($parametro1, $parametro2)
{
$sql = "SELECT campo1, campo2, campo3 FROM tabla WHERE campo4='$parametro1' AND campo5='$parametro2'";
$connection = Yii::app()->db;
$command = $connection->createCommand($sql);
$dataReader = $command->queryAll();
return $dataReader;
}