Ликбез по АР

Всем привет, я в ОРМ/АР полный чайник, до этого писал raw sql.

Ситуация следующая, есть 3 таблицы: video, category, video_category.

Как тут может быть очевидно что video_category мапит 2 первые таблицы.

Т.е. какие видео в каких категориях могут находится.

Ну и естественно не могла не появится ситуация, при которой надо выбрать все видео конкретной категории.

Нашел в доке что надо описать связи между таблицами.

Сделал так:




class video extends CActiveRecord {

	

	public static function model($className=__CLASS__) {

		return parent::model($className);

	}

	

    public function relations() {

        return array(

            'categories' => array(self::MANY_MANY, 'Category', 'VideoCategory(video_id, category_id)'),

        );

    }

	

}


class category extends CActiveRecord {


	public static function model($className=__CLASS__) {

		return parent::model($className);

	}

	

	

    public function relations() {

        return array(

            'videos' => array(self::MANY_MANY, 'Video', 'VideoCategory(video_id, category_id)'),

        );

    }

	

}




class VideoCategory extends CActiveRecord {

	

	public $video_id;

	public $category_id;

	

	public static function model($className=__CLASS__) {

		return parent::model($className);

	}

	

	public function tableName() {

	    return 'video_category';

	}	


    public function relations() {

        return array(

            'categories' => array(self::HAS_MANY, 'Category', 'category_id'),

            'videos' => array(self::HAS_MANY, 'Video', 'video_id'),

        );

    }

	

}




затем в виджите делаю эту выборку




$data = Category::model()->with('videos')->findByPK($this->category_id);



в итоге вываливается с такой ошибкой




CDbException

Description


Active record "video" is trying to select an invalid column "*". Note, the column must exist in the table or be an expression with alias.



направьте на путь истинный плиз, а дальше я уже сам буду учится.

Спасибо.

В таких ситуациях, самое простое, что можно сделать - посмотреть в лог и проверить какой запрос был сгенерирован AR…может это подскажет Вам в чем проблема.

Сори, я нуб в YII, а что подразумевается под логом ?

тот что runtime/application.log ? если он, то он какой-то бред странный выводит, при чем с других сайтов !




'categories' => array(self::MANY_MANY, 'Category', 'VideoCategory(video_id, category_id)')






'videos' => array(self::MANY_MANY, 'Video', 'VideoCategory(video_id, category_id)'),




VideoCategory должно быть названием таблицы (таблицы-связки) , а не модели

проблема оказалась в том что в одной из моделей у меня в дефолтскоп было нечто такое ‘*, some_math_funcs() as result’

убрал, все заработало, только вот не совсем понимаю как выбрать по 2м таблицам.




$data = Category::model()->with('videos')->findByPK($this->category_id);



вот это вроде выбирает то что надо, но выбирает только 1 запись, а их несколько.

как скрестить с findAll не могу понять.

пробовал через




    	$criteria = new CDbCriteria();

    	$criteria->condition = "category_id = :category_id";

    	$criteria->params = array(':category_id' => $this->category_id );

    	

    	$data = category::model()->with('videos')->findAll($criteria);




вообще выводится только 1 запись, и то только из таблицы category по этому ID.

есть подозрение что какие-то параметры забыл добавить.

нашел в чем проблема была, в одной из связок не правильно ключи установил.

исправил, все теперь работает нормально, но вот вместо findAll мне надо count.

A count вылетает с Integrity constraint violation.