Проблема с CActiveDataProvider

Недавно решил перейти с Zend на Yii, возникла проблема с CActiveDataProvider, а именно при использовании с связанными таблицами.

Есть три таблицы posts, posts_topics, topics (стандартная модель тегов многие ко многим)

Необходимо вывести все посты по заданной теме (тегу)




$dataProvider = new CActiveDataProvider('Post', array(

				'criteria' => array(

					'condition' => 'topics.seo = :seo',

					'params' => array(':seo' => $_GET['topic_url']),

					'with' => array('topics'),

					'order' => 'update_time DESC'

				),

				'pagination' => array(

					'pageSize' => Yii::app()->params['postsPerPage'],

				),

			));



И судя по Документации все верно.

Но при выводе возникает ошибка “Column not found: 1054 Unknown column ‘topics.seo’ in ‘where clause’”

Смотрю лог и вижу два запроса:

первый (который кстати работает и построен верно)




SELECT

  COUNT(DISTINCT `t`.`id`)

FROM `posts` `t`

  LEFT OUTER JOIN `posts_topics` `topics_topics`

    ON (`t`.`id` = `topics_topics`.`post_id`)

  LEFT OUTER JOIN `topics` `topics`

    ON (`topics`.`id` = `topics_topics`.`topic_id`)

WHERE (topics.seo = :seo)



и второй (на котором вываливается исключение)




SELECT

  `t`.`id`          AS `t0_c0`,

  `t`.`title`       AS `t0_c1`,

  `t`.`content`     AS `t0_c2`,

  `t`.`create_time` AS `t0_c3`,

  `t`.`update_time` AS `t0_c4`,

  `t`.`author_id`   AS `t0_c5`,

  `t`.`seo`         AS `t0_c6`

FROM `posts` `t`

WHERE (topics.seo = :seo)

ORDER BY update_time DESC

LIMIT 15)



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

У Вас relation прописаны?

http://yiiframework.ru/doc/guide/ru/database.arr

Попробуйте


$dataProvider = new CActiveDataProvider('Post', array(

                                'criteria' => array(

                                        'condition' => 'topics.’seo’ = :seo',

                                        'params' => array(':seo' => $_GET['topic_url']),

                                        'with' => array('topics'),

                                        'order' => 'update_time DESC'

                                ),

                                'pagination' => array(

                                        'pageSize' => Yii::app()->params['postsPerPage'],

                                ),

                        ));

Поставить кавычки ‘condition’ => ‘topics.’seo’ = :seo’, (кавычки те, что над Tab)

или ‘condition’ => ‘topics.’seo’ = :seo’,

Ну и соответственно проверьте, прописаны ли правильно все отношения и поля в базе.

Спасибо за ответы, проблема оказалась все же в самом CActiveDataProvider, при запросе он дейсвительно не учитывает условия по связанным таблицам вот общая ветка с этой проблемой.

Решается новым классом наследованным от CActiveDataProvider, может кому пригодиться




<?php

class ActiveDataProvider extends CActiveDataProvider

{

        private $_together = false;


        /**

         * Fetches the data from the persistent data storage.

         * @return array list of data items

         */

        protected function fetchData()

        {

                $criteria=clone $this->getCriteria();

                if(($pagination=$this->getPagination())!==false)

                {

                        $pagination->setItemCount($this->getTotalItemCount());

                        $pagination->applyLimit($criteria);

                }

                if(($sort=$this->getSort())!==false)

                        $sort->applyOrder($criteria);

                

                if ($this->_together) 

                { 

                        return CActiveRecord::model($this->modelClass)->with($criteria->with)->together()->findAll($criteria);

                }

                else

                {

                        return CActiveRecord::model($this->modelClass)->findAll($criteria);

                }

        }

        

        /**

         * @return param Together. If true, the method fetchData add together at the findAll

         */

        public function getTogether()

        {

                if($this->_together===null)

                        $this->_together=false;

                return $this->_together;

        }


        /**

         * @param boolean the together option. If true, the method fetchData add together at the findAll

         */

        public function setTogether($value)

        {

                $this->_together=(bool) $value;

        }

        

}



Использовать так:




new ActiveDataProvider('Model', array(

                        'criteria'=>$criteria,

                        'together'=>true,

                ));