Relations sin Foreign keys.

buenas compañeros, despues de mucho tiempo vuelvo a las andadas con YII.

Tengo ya un sistema funcionando en Myisam, segun estuve leyendo a parti de la version jno recuerdo cual, no es estricto el uso de las fk para hacer una relacion entre tablas, estuve racticando un poco(un par de dias) con dos simples tablas como para empezar. Y cual es mi sorpresa que “o soy un inutil” o algo no funciona ¬¬ me inclino mas a lo segundo pero bueno :D

Paso a mostrar mis dos tablas:

Alumnos

id

nombre

apellido

paisId

Pais

id

nombrePais

(como puede ser que este tan atascado con esto…)

Bien tengo creado mis dos models y aca es donde me pierdo un poco:

Alumnos.php




   <?php




class Alumnos extends CActiveRecord

{


	

	public $verifyCode;

	


	/**

     * Returns the static model of the specified AR class.

     * @return Post the static model class

     */

    public static function model($className=__CLASS__)

    {

        return parent::model($className);

    }


    /**

     * @return string the associated database table name

     */

    public function tableName()

    {

        return 'Alumnos';

    }

	

	public function relations(){

	

	

	return array(

	    'pais'=>array(self::BELONGS_TO, 'Pais', 'id')

	    );

	

	}


	/*rules */


	

	public function rules()

	{

		return array(

			// name, email, subject and body are required

			array('nombre, apellido, paisId', 'required'),

			array('nombre, apellido, paisId, edad','safe'),

			

			array('verifyCode', 'captcha', 'allowEmpty'=>!CCaptcha::checkRequirements()),

		);

	}




		public function attributeLabels()

	{

		return array(

			'verifyCode'=>'Verification Code',

		);

	}


	}



Pais.php




<?php


class Pais extends CActiveRecord{




   	public static function model($className=__CLASS__)

	{

		return parent::model($className);

	}

	

	public function tablename(){

	

	return 'Pais';

	

	}

	

	public function relations(){

	

	return array(

	     'alumnos' => array(self::HAS_MANY, 'Alumnos', 'paisId')

	        );

	

	}

	


}



Y este es mi controller (aclaro que tengo un simple crud ya funcionando, solo me da problemas en la relación) Lo puse todo en el controller para poder hacer pruebas(ya se que va en el modelo) <_<

AlumnosController.php




public function actionIndex(){

		

		/*lista alumnos*/


			

   

	$page_size = 5;

    //criteria

    $criteria = new CDbCriteria();

	$criteria->order = 'id';

	$criteria->limit = $page_size;

	//$criteria->with=array('pais.nombrePais');

    $item_count = Alumnos::model()->count($criteria);

	

	

	

	$pages =new CPagination($item_count);

	$pages->pageSize=$page_size;

	$pages->applyLimit($criteria);

	$data['pages'] = $pages;

	

		

		$data['datas'] = Alumnos::model()->with('nombrePais')->findAll($criteria);

		$data['title'] = "Este es el listado";

		$this->render('index', $data);


}



->with(‘nombrePais’)-> >:(

El error que me arroja es

CDbCommand falló al ejecutar la sentencia SQL: SQLSTATE[42S22]: Column not found: 1054 Unknown column ‘nombrePais.’ in ‘on clause’

Antes de que llegue hasta aca le di un millon de vueltas, me lei cuanto aparecia en google, vi los videotutorials, y agotada ya la paciencia recurro a ustedes. Si alguien me lo explica o que me de una luz de guia estaria agradecido hasta la eternidad! :P

No he probado con MyIsam pero la relación como la tienes entonces sería:




$item_count = Alumnos::model()->with('pais')->count($criteria);

$data['datas'] = Alumnos::model()->with('pais')->findAll($criteria);



Se usa el nombre que has puesto en la relación del modelo Alumnos:




public function relations(){              

        return array(

            'pais'=>array(self::BELONGS_TO, 'Pais', 'id')

            );        

        }



Eso lo has probado?

Imagino que si…

Hola compañero, pues si lo probe, pero al fin pude solventarlo, le estaba dando mil vueltas a algo que era tan simple :D

No es necesario crear un fk, y tampoco usar el metodo with(no se hasta que punto es necesario o no)

Solo se necesita hacer una relacion en mi caso en el model Alumnos.php




	public function relations(){

	

	

	return array(

	    'pais'=>array(self::BELONGS_TO, 'Pais', 'paisId')

	    );

	

	}



Y en el controller




$data['lista'] = Alumnos::model()->findAll($criteria);



y listo. (me parece que el error era por que alumnos no tenia el primarykey definida, pero le di tantas vueltas que no estoy seguro que la solución haya sido esa… :huh: )

Saludos y gracias por estar :P