Seleccionar 2 modelos con UNION

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?

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.

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… :unsure:

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.

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';



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.

Hola, quiero hacer un count en la clase CDbcriteria… alguien sabe? saludos

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.