Вопрос по AR

Есть две таблицы - news и category. Связка многие ко многим через таблицу newscategory.

Какиб образом можно сделать запись в newscategory при добавлении новости?

Только вручную или можно обратится к модели news и что-то с ней сделать? :)

Скорее всего тебе нужно сделать в модели News следующий код:



protected function beforeSave()


{


	foreach ($this->categories as $name) // или как у Вас получается список категорий, куда попадает новость


	{


		if (Category::model()->findByAttributes(array('name'=>$name) === null)


		{


			$category=new Category(array('name'=>$name));


			$category->save();


		}


		$this->dbConnection->createCommand("INSERT INTO newscategory (newsId, categoryId) VALUES ({$this->id},{$category->id})")->execute();


	}


}


Примерно так…

Я в итоге так и сделал, только не стал это в модель выносить, а просто в action добавил нечто похожее на

$this->dbConnection->createCommand("INSERT INTO newscategory (newsId, categoryId) VALUES ({$this->id},{$category->id})")->execute();

Ну, на вкус и цвет - все фломастеры разные…

Но мне один товарищ сказал как-то, когда я только узнавал про MVC, что это такая примерно вещь:

  Всё, что отвечает за отображение данных - пихай во вью;

  Всё, что отвечает за данные - пихай в модель;

  А контроллер - так… он получает, передает, получает, передает…

Работа с БД должна в идеале быть только внутри модели.

Хмм… если следовать таким правилам - то куда мне пихать выборку из базы?

имеется ввиду код вида



        $criteria=new CDbCriteria;


        $criteria->select='altname, title, createDate, metaKeywords, viewsCnt, commentsCnt, short';


		$criteria->condition='news.published='.News::STATUS_PUBLISHED;


		$criteria->condition.=' and news.openDate <= UNIX_TIMESTAMP()';


		$criteria->condition.=' and news.blogId = 1';


		$criteria->order='news.createDate DESC';





        $posts=News::model()->with(array('author'=>array(


                                            'select'=>'username,displayname'


                                         ),


                                         'category'=>array(


                                            'select'=>'name, altname',


                                            'condition'=>'??.blogId = 1 and ??.visible = 1'


                                         )


                                   ))->together()->findAll($criteria);


это наврно все-таки в контролере оставить надо :)

Ну, спорить можно долго. Главное не начинать - "какой фремворк нам настоящий MVC даёт?!"…

Но в Вашем случае, вы же не выборку из БД делаете, а критерий выборки, а вот критерий выборки как раз и нужно делать в контроллере - он решает какие данные ему нужно выбрать из модели, чтобы передать их в представление.

Контроллер - логика приложения. Он как “разводящий” в узких кругах  :D.

Не, спорить я не собираюсь )) Yii один из лучших вариантом MVC :)

Quote

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

лично я в папке моделей создаю файл, допустим - NewsADO.php,

где и собраны в кучу все select SQL-запросы (см. скриншот), а в

контроллере пишется так:

[tt]    public function actionTable()

    {

        $this->render('table',array('rows'=>NewsADO::getTable()));

    }

[/tt]

если есть необходимость использовать все преимущества модели, то

класс NewsADO может быть потомком модели News

Quote

Контроллер - логика приложения. Он как "разводящий" в узких кругах

правильно контроллер - это диспетчер. за исключением тех моментов,

когда надо делать в модели insert, update, delete.

[tt]    public function actionDelete()

    {

        News::model()->deleteByPk($_GET['id']);

        $this->redirect(array('table'));

    }[/tt]

от себя добавлю, если у вас в контроллере замечательная "читабельность"

кода, то вы поняли назначение MVC. поздравляю!

Мне кажется все-таки выборку данных надо оставить за контроллером, а в модели прописывать пре и пост обработку данных

своя рука - владыка!

а теперь представь, что в проэкте тебе надо эдак разика 3

в разных контроллерах использовать одину и ту же выборку

из базы.

Quote

своя рука - владыка!

а теперь представь, что в проэкте тебе надо эдак разика 3

в разных контроллерах использовать одину и ту же выборку

из базы.

согласен - потому делаю методы в модели…