Saludos :
Necesito hacer un select de 2 tablas con los mismos campos. Buscando informacion he visto este mensaje. La solucion que dan es crear una vista en mysql con la consulta y luego crear un modelo en yii con el que acceder a los datos.
Me gustaría saber si alguno conoce otra manera alternativa de hacer esto, con criteria, o alguna manera de seleccionar datos de 2 modelos.
En el caso de ser esta la única manera no consigo hacer una que funcione una relación que he creado en este modelo que pertenece a una vista de mysql, ¿existe algún problema al hacer esto?
sebas
(Sebathi)
March 23, 2010, 12:43pm
2
No se si funcionará, pero probaste de usar un findAllBySql???
Gracias sebas.
Así da error :
$criteria=new CDbCriteria;
$criteria->condition='UNION SELECT * FROM novedad';
$articuloList = articulo::model()->findall($criteria);
Consigo lo que necesito de esta manera :
$sql = 'SELECT * FROM articulo UNION SELECT * FROM novedad ORDER BY created_at DESC LIMIT 10 ';
$articuloList = articulo::model()->findAllBySql($sql);
Pero me encuentro con el problema de que no se paginar estos resultados sin un criteria.
cyberpol
(Cyberpol 777)
March 23, 2010, 1:25pm
4
El criteria aparentemente no esta preparado para consultas de union. Por lo que calculo que vas a tenes que hacer la paginacion “a mano”
eso de hacer a mano la paginación, alguna pista…
cyberpol
(Cyberpol 777)
March 23, 2010, 2:05pm
6
Basicamente necesitas dos consultas.
La primera la que te trae el TOTAL de registros.
La segunda es la que vas cambiando el LIMIT X, Y cuando das click en los links de las paginas.
Donde LIMIT X, Y (X = a partir de que registro, empiezan en cero; Y = cuantos registros a partir de ese)
otra idea
trabaja normalmente
…new new CDbCriteria
…new CPagination
…new CSort
y … (mirá el codigo del framework CDbCommandBuilder function createFindCommand)
$sql = 'SELECT * FROM articulo UNION SELECT * FROM novedad ORDER BY created_at DESC LIMIT 10 ';
// lo nuevo
sql=CDbCommandBuilder::applyOrder($sql,$criteria->order);
$sql=CDbCommandBuilder::applyLimit($sql,$criteria->limit,$criteria->offset);
//hay mas funciones
$articuloList = articulo::model()->findAllBySql($sql);
no tested
Esto es lo que tengo al final :
$criteria=new CDbCriteria;
$sql = 'SELECT * FROM articulo UNION SELECT * FROM novedad';
$criteria->order='created_at DESC';
$criteria->limit=16;
$pages=new CPagination(vista_novedad::model()->count($criteria));
$pages->pageSize=self::PAGE_SIZE;
$pages->applyLimit($criteria);
$sql=CDbCommandBuilder::applyOrder($sql,$criteria->order);
$sql=CDbCommandBuilder::applyLimit($sql,$criteria->limit,$criteria->offset);
$articuloList = articulo::model()->findAllBySql($sql);
$this->render('lastPosts',array(
'articuloList'=>$articuloList,
'pages'=>$pages,
));
Para usar la paginacion he tenido que usar la vista que he creado en mysql y el modelo ya que no encuentro la manera de hacer un count del $sql.
ciudadredonda:
Esto es lo que tengo al final :
$criteria=new CDbCriteria;
$sql = 'SELECT * FROM articulo UNION SELECT * FROM novedad';
$criteria->order='created_at DESC';
$criteria->limit=16;
$pages=new CPagination(vista_novedad::model()->count($criteria));
$pages->pageSize=self::PAGE_SIZE;
$pages->applyLimit($criteria);
$sql=CDbCommandBuilder::applyOrder($sql,$criteria->order);
$sql=CDbCommandBuilder::applyLimit($sql,$criteria->limit,$criteria->offset);
$articuloList = articulo::model()->findAllBySql($sql);
$this->render('lastPosts',array(
'articuloList'=>$articuloList,
'pages'=>$pages,
));
Para usar la paginacion he tenido que usar la vista que he creado en mysql y el modelo ya que no encuentro la manera de hacer un count del $sql.
Buena idea lo de la vista, porque no creas un model a partir de esa vista y no tienes que hacer nada extra? asi podrias usar el find normalmente
la parte extra es crear la public function primaryKey()
mira este post
http://www.yiiframework.com/forum/index.php?/topic/5444-como-trabajar-con-vistas-de-la-base-de-datos/
para hacer un count de la union puedes hacer algo como
$sql = 'select count(1) from (SELECT * FROM articulo UNION SELECT * FROM novedad) as tmp_union';
hascrock
(Hasbelcaro)
July 26, 2011, 1:03pm
10
Hola, alguien por favor podría explicarme como hacer consultas con el framework inyectando código sql para mostrar campos de varias tablas en una sola vista… he visto código pero no se como implementarlo. Cualquier tutoría, se les agradece.
Buen día.
Orlandito
(Ocruz)
February 26, 2015, 6:40pm
11
Hola, quiero hacer un count en la clase CDbcriteria… alguien sabe? saludos
gifrancohe
(Giovannyfrancoherrera)
June 24, 2015, 2:22pm
12
Es muy sencillo te dejo un ejemplo:
$criteria = new CDbCriteria();
$criteria->condition = 'live=1';
$count = Page::model()->count($criteria);
Esto es equivalente a SELECT COUNT(*) FROM page WHERE live=1.