Вопрос по работе с AR

в модели Items объявляю relations:

public function relations()


	{


        return array(


	'category'=>array(self::MANY_MANY, 'Category', 'ItemCategory(itemid, categoryid)'),


        );


	}

в контроллере делаю выборку:



$criteria=new CDbCriteria;


$criteria->order='item.createTime DESC';


$itemList=Item::model()->with(array('category'=>array(


                                            'select'=>'id, name'


                                         ),


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


в просмотре (view) перебираю $itemList :



<?php foreach($itemList as $n=>$model): ?>


<?php echo CHtml::encode($model->id); ?>


...


<?php endforeach; ?>


не соображу как мне во view вывести category->name

$model->category->name

Quote

$model->category->name

почему-то нет  :-[

ничего не выводит, хотя print_r ($model->category) выводит информацию об объекте Category и там есть

[_attributes:private] => Array


                (


                    [id] => 2


                    [name] => Категория 1


                )


хм-м… странно…

тогда попробуй

$model->category['name']

скорее всего косяк в том, что $model->category является масивом (поскольку у тебя many to many), попробуй $model->category[0]->name.

или же делай цикл

Quote

скорее всего косяк в том, что $model->category является масивом (поскольку у тебя many to many), попробуй $model->category[0]->name.

или же делай цикл

точно! возвращает массив, который надо перебрать для вывода всех категорий.

спасибо!

Лучше всего в модели Items сделай чего-нить типа такого



	public function getPostCategories()


	{


	    $links = array();


	    $cats = $this->categoryCache ? unserialize($this->categoryCache) : $this->category;


	    foreach($cats as $cat)


	        $links[] = CHtml::link(CHtml::encode($cat->name),array('news/category','category'=>$cat->altname));


	    return implode(', ',$links);


	}


Ага, спасибо.

Нужно только имена категорий сделал по аналогии:

	public function getItemCategoryNames()


    {


       $_categories = array();


       foreach($this->category as $cat)


           $_categories[] = $cat->name;


       return implode(', ',$_categories);


   	}

Вдогонку вопрос:

А как в форме сделать редактирование этого самого мультивыбора?



<?php echo CHtml::activeLabelEx($item,Item::model()->attributeLabels['category']); ?>


<?php echo CHtml::activeDropDownList($item->category, 'id', CHtml::listData( Category::model()->findAll(), 'id', 'name' ), array('multiple'=>'multiple')); ?>


вывод ошибки, что $item->category не модель, но это понятно, там массив…

$item->category[0] или $item->category[1] selected в дропдоунлисте ставится по одному значению соответственно, а как сделать, чтобы все значения выставлялись?

Отвечу сам себе, основываясь на этом ответе:

http://www.yiiframew…36.html#msg5636

в загрузке loadItem прописал

$this->_item=Item::model()->with('category')->findbyPk($id!==null ? $id : $_GET['id']);


				$_categories = array();


				foreach ($this->_item->categories as $i=>$cat) {


					$_categories[] = $cat['id'];


				}


				$this->_item->category = $_categories;

в форме:



$htmlOptions['multiple'] = true;


$htmlOptions['name'] = get_class($item).'[category]'.'[]';


echo CHtml::activeDropDownList($item, "category", CHtml::listData( Category::model()->findAll(), 'id', 'name' ), $htmlOptions);