Gloss82
(Gloss82)
September 3, 2010, 7:31am
1
Есть таблица, в которой хранятся рубрик/подрубрики/подподрубрики и т.д.
Поля id, pid (здесь ид родителя), title (заголовок рубрики)
С помощью реляционной AR вышло очень просто получать всех детей текущей модели
public function relations()
return array(
'childs' => array(self::HAS_MANY,'GisRubrics','pid'),
Все дети элемента получаются в контроллере простым действием
$childs = $model->childs;
А вот с родителем все никак не получается.
Пробовал
'parent' => array(self::BELONGS_TO,'GisRubrics','id'),
Не работает. Как бы сделать, чтобы родителя можно было получить так:
$parent = $model->parent;
someone
(198506)
September 3, 2010, 7:54am
2
‘parent’ => array(self::BELONGS_TO,‘GisRubrics’,‘pid ’),
но учти, что parent вернется только запись предыдущего уровня (т.е. иерархии не совсем данный метод подходит),
у меня по такому же принципу реализована табличка
'childs' => array(self::HAS_MANY, 'Routes', 'parent_id', 'together'=>true),
'parents' => array(self::BELONGS_TO, 'Routes', 'parent_id',),
Gloss82
(Gloss82)
September 3, 2010, 8:05am
3
Не работает, возвращает NULL
someone
(198506)
September 3, 2010, 8:27am
4
Что-то странно, смотри как я у себя воспроизвел:
CREATE TABLE `GisRubrics` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`pid` int(11) NOT NULL DEFAULT '0',
`title` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of GisRubrics
-- ----------------------------
INSERT INTO `GisRubrics` VALUES ('1', '0', 'Новости');
INSERT INTO `GisRubrics` VALUES ('2', '1', 'Авто');
INSERT INTO `GisRubrics` VALUES ('3', '0', 'Статьи');
INSERT INTO `GisRubrics` VALUES ('4', '1', 'Происшествия');
Модель:
public function relations()
{
return array(
'childs'=>array(self::HAS_MANY, get_class($this), 'pid'),
'parent'=>array(self::BELONGS_TO, get_class($this), 'pid'),
);
}
Контроллер:
class GisController extends Controller {
public function actionIndex()
{
$rows = GisRubrics::model()->with(array('childs', 'parent'))->findAll();
foreach ($rows as $k => $row)
{
if($row->parent)
echo $row->title.' / '.$row->parent->title.'<br/>';
else
echo '<b>'.$row->title.'</b><br/>';
}
}
}
на выходе:
Новости
Авто / Новости
Статьи
Происшествия / Новости
Gloss82
(Gloss82)
September 3, 2010, 9:49am
5
Да спасибо, все заработало. Чуть голову не сломал себе, а оказалось что базу данных неправильно заполнил (pid не ссылался на правильного родителя). Спасибо!