[RESUELTO] Obtener articulos relacionados

Saludos :

En mi aplicación tengo articulos y etiquetas y lo he hecho según el tutorial de blog de yii, de manera que para obtener las etiquetas de un artículo llamo a $articulo->getTagArray().

Me gustaría en cada artículo poder obtener un listado de los articulos relacionados, que son aquellos que comparten subseccion_id y 2 etiquetas por lo menos.

He creado esta función en el modelo articulo, pero consume demasiados recursos creo que no es la mejor manera, sabbe alguien una manera más sencilla o puede orientarme??


public function getRelacionados($articulo_id){

	   

		ini_set('memory_limit','32M'); 

		

		$articulo=articulo::model()->find('id='.$articulo_id);


	   	$relacionados = articulo::model()->findAll('subseccion_id=:subseccion', array(':subseccion'=>$articulo->subseccion_id));

	

		$articulos = array();

		

		foreach($relacionados as $relacionado):

		 if( count(array_intersect($articulo->getTagArray(),$relacionado->getTagArray())) >=2 && $relacionado->id!=$articulo->id ) {

			array_push($articulos, $relacionado);

		 } 			

		endforeach;

		

		return $articulos;

	}

Gracias

1- Si usas PHP 5.3 no vas a tener problema ya que arreglan el garbage collector. Sino el problema esta en que no la estas liberando.

2- No es mejor usar una relación en tag que te busque a los relacionados y la haces así:

public function relations{

return array(

  'tagsConRelacionados'=>array(.... , 'with'=>'items'); // items es una relacion de tags que indica cuales son los items que tienen ese tag...

);

}

y cuando lo llamas ponés lo que querés…

Saludos

Al final esta es la solución que he encontrado.

En el modelo artículo, una función que me devuelve los artículos relacionados que obtengo al recorrer las etiquetas del artículo(($articulo->getTagArray()), si los artículos de esa etiqueta pertenecen a la misma sección y no es el artículo del que queremos sacar los relacionados lo añado a $relacionados:




public function getRelacionados($articulo_id){   		

		

		$articulo=articulo::model()->find('id='.$articulo_id);

		

		$relacionados = array();

		foreach($articulo->getTagArray() as $name)

	    {

		    $etiqueta = etiqueta::model()->findByAttributes(array('nombre'=>$name));

		    foreach($etiqueta->articulos() as $art)

		    {

				if($articulo->subseccion_id == $art->subseccion_id && $articulo->id != $art->id)

		    	array_push($relacionados, $art);		        

		    }

		}

	    return $relacionados;

	}



Por si alguno le sirve.