Небольшой вопрос по AR

Немного запутался с алиасами и aliasToken ( ??. в запросах).

На сколько я понимаю ??. заменяется когда используются relations. А как быть в таком случае:

Есть AR для категорий, relations прописан так



    public function relations() {


        return array(


        'post'=>array(self::HAS_MANY, 'Publication', 'id'),


        'blog'=>array(self::HAS_ONE, 'Blog', 'blog_id'),


        'child'=>array(self::HAS_MANY,'Category','parent_id'),


        );


    }


В контроллере вызываю так - Category::model()->head()->with('child')->together()->findAll();

Все работает прекрасно, получаю категории с подкатегориями.

Дальше решил добавить дефолтовое условие, что статус у категории должен быть 1 (открыта). Сделал через defaultScope:



    public function defaultScope()


    {


        return array(


            'condition'=>'status='.self::STATUS_OPENED,


        );


    }


еще есть scope "head" для того чтобы вытащить только верхние категории



    public function scopes()


    {


        return array(


            'head'=>array(


                'condition'=>'parent_id=0',


            )


        );


    }


И естественно вылетает ошибка, так как столбец status есть как для категории, так и для подкатегории. Если указать ??.status - то не подставляется алиас для категории.

Как решить такую проблему? может можно указать алиас для модели?

у тебя AR Category с таблицей Category

и relation child тоже с таблицей Category что-ли?

Ну да))) я сделал relation модели на саму себя

понимаю что возможно это криво, но я не догоняю как лучше реализовать подкатегории

чего-то ты мудришь

простейшее дерево - это 3 поля в таблице id, parent_id, level

select id where paren_id = 0 - это выборка всех под корнем

какие тут relations?!

погугли про реализацию деревьев и nested set сделан уже

Да я думал что деревья для подкатегорий это перебор :)

ладно, поробую  :) спс

Деревья для подкатегорий не перебор. Реализация через relations и named spaces перебор. NestedSets из extensions очень кривой, но в целом работает (не вызывает события, некоторые методы работают неправильно, нет поддержки множества корней). Но все же на выборку он работает намного быстрее чем у вас через relations.

В данный момент портирую Doctrine NestedSet behavior в Yii, там будут учтены все недостатки того что в extensions.

Я почему-то всегда думал что реализация подкатегорий это что-то простое…ну или в крайнем случае о деревьях я даже не думал, пора вспоминать 2 томик Кнута))

Попробую заюзать деревья, посмотрим что из этого выйдет :)

а вы предполагаете только 1 уровень вложености или неограниченое кол-во?

вообще думал только 1 уровень, ибо для категорий новостей больше не надо

Тогда 2 таблицы. С точки зрения реляционных БД и этих целей это будет более правильно чем заведение поля parentID в одной. Будет очень небольшая избыточность в последнем случае. При этом с relations и named spaces не будет возникать проблем.

вроде даже одной таблицей обойтись можно ?

тема стала неожиданно интерестна - вот что нагуглил http://lib.protoplex…b_show/185.html

creocoder,

в принципе можно и одной таблицей обойтись, если не использоваться scopes при выводе категорий с подкатегориями…

to ppy

одной таблицей - естественно получиться дерево о котором говорили уже выше :)

Digital God

Можно, но конкретно для этой задачи быстрее и правильнее с точки зрения проектирования БД будет именно 2 таблицы. Все потому, что JOIN таблицы самой с собой медленнее, чем JOIN 2 разных таблиц, при условии, что количество записей в 1 и 2 случае одинаково. Но если делать нормальное универсальное приложение, то лучше конечно сделать модуль категорий, основанный на 3 основных моделях деревьев (NS, AL, MP + комбинации) для разных задач и использовать эти таблицы категорий для всего (добавив поддержку множественных корней).

creocoder, спасибо за совет… модуль наверно слишком жирно для категорий, по крайней мере учитывая мою структуру приложения… но идею уловил

Я надеюсь, что очень скоро появится что-то нативное в виде ActiveRecordbehavior в комплекте фреймворка. Хотелось бы посмотреть такое решение от quang.

И все таки как правильно задать aliasToken. У меня та же проблема. Помогите плиз. А то приходиться извращаться всякими кривыми путями.