Есть две таблицы - news и category. Связка многие ко многим через таблицу newscategory.
Какиб образом можно сделать запись в newscategory при добавлении новости?
Только вручную или можно обратится к модели news и что-то с ней сделать?
Есть две таблицы - 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 даёт?!"…
Но в Вашем случае, вы же не выборку из БД делаете, а критерий выборки, а вот критерий выборки как раз и нужно делать в контроллере - он решает какие данные ему нужно выбрать из модели, чтобы передать их в представление.
Контроллер - логика приложения. Он как “разводящий” в узких кругах .
Не, спорить я не собираюсь )) 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
в разных контроллерах использовать одину и ту же выборку
из базы.
согласен - потому делаю методы в модели…