Tenho uma paradinha de menus aninhados eternos, talvez lhe interesse ou
outra pessoa, a estrutura é  pessoa esta vinculada a uma pessoa pai, tem
ate impressao


*Model Menu*
*
*
*   *class Model_Menu extends ORM {
..
protected $_belongs_to = array('pai' => array('model' => 'menu',
'foreign_key' => 'menu_id'));

public static function getMenus() {
        return ORM::Factory('menu')
                        ->find_all()
                        ->as_array('id', 'descricao');
    }


*Helper de Impressao*
*
*
*   *public static function imprimeMenu(&$saida, array $menus, $pai = 0,
$nivel = 0) {

        $atributos = '';
        if ($pai == 0)
            $atributos = ' class="sf-menu"';

        $i = 0;

        $saida .= str_repeat(" ", $nivel) . "<ul$atributos>" . PHP_EOL;

        if (isset($menus[$pai])) {
            foreach ($menus[$pai] as $id => $menu) {

                // imprime o item do menu
                $saida .= str_repeat(" ", $nivel + 4);
                $saida .= '<li>';
                $saida .= '<a href="' . strtolower($menu['url']) . '"
class="' . ($i == 0 && $nivel == 0 ? 'first' : '') . '">';


                if ($menu['exibe_icone'] != "N")
                    $saida .= '<img src="' . URL::base() .
'media/imagens/icones/' . strtolower($menu['icone']) . '" /> ';
                else
                    $saida .= '<img src="' . URL::base() .
'media/imagens/icones/empty.png" /> ';

                if ($menu['exibe_descricao'] != "N")
                    $saida .= $menu['descricao'];

                if (isset($menus[$id])) {
                    if ($nivel == 0)
                        $saida .= '<img src="' . URL::base() .
'media/imagens/icones/arrow_down_gray.png" /> ';
                    else
                        $saida .= '<img src="' . URL::base() .
'media/imagens/icones/arrow_right_gray.png" /> ';
                }

                $saida .= '</a>';

                // se tiver filhos, entra recursivamente
                if (isset($menus[$id]))
                    self::imprimeMenu($saida, $menus, $id, $nivel + 4);

                $saida .= '</li>' . PHP_EOL;

                $i++;
            }
        }

        $saida .= str_repeat(" ", $nivel) . '</ul>' . PHP_EOL;
    }

    public static function getMenu() {

        $grupo = Helper_USUARIO::getGrupo();

        if ($grupo->grupomenu->id == null) {
            $menus = $grupo->menus;
        } else {
            $menus = $grupo->grupomenu->menus;
        }

        $menus = $menus->where('ativo', '!=', 'N')
                ->order_by('ordem', 'asc')
                ->order_by('descricao', 'asc')
                ->find_all();

        foreach ($menus as $menu) {

            if ($menu->pai->id == null)
                $menu->pai->id = 0;

            $menuArray[$menu->pai->id][$menu->id] =
                    array('descricao' => $menu->descricao,
                        'icone' => $menu->icone,
                        'exibe_descricao' => $menu->exibe_descricao,
                        'exibe_icone' => $menu->exibe_icone,
                        'url' => $menu->url);
        }

        $saida = '';

        if (isset($menuArray)) {
            self::imprimeMenu($saida, $menuArray);
        }

        return $saida;
    }

[]s,

Douglas J.A.M
[email protected]
(37) 9949-8949


Em 24 de maio de 2013 14:05, Fabyo Guimaraes <[email protected]> escreveu:

> Felipe do jeito que voce falou deu certo em parte funcionou para o pai
> menos para o avo
>
> $accounts = ORM::Factory('filho')
> ->with('pai')
>  ->order_by('pai.name', 'ASC')
>
> só que para o avo nao deu certo porque o filho nao tem relação direta com
> o avo e sim com o pai
> entao como ficaria para ordenar o avo?
> tentei isso mas nao deu
>
> $accounts = ORM::Factory('filho')
> ->with('avo')
>  ->order_by('avo.name', 'ASC')
>
> Database_Exception [ 1054 ]: Unknown column 'avo.name' in 'order clause'
>
>
> Em 24 de maio de 2013 13:49, Fabyo Guimaraes <[email protected]>escreveu:
>
> Valeu Felipe vou tentar dessa maneira tbm
>>
>>
>>
>> Em 24 de maio de 2013 13:11, felipe bastos <[email protected]>escreveu:
>>
>> Opa, cheguei e nao li tudo ..
>>>
>>> Acho que fez uma arvora de tres niveis: filho, pai e avo ;)
>>>
>>> Imagino que tenha colocado ..
>>>
>>> Model Algo
>>> Belongs_to pai array model Algo
>>>
>>> Sua chave estrangeira de si proprio deve ser pai_id
>>>
>>> Assim, o avo é o pai do pai (obvio)
>>>
>>> $filho ....
>>> $pai ... $filho-pai;
>>> $avo ... $filho-pai-pai;
>>>
>>> Neste caso, vc pode ordenar por pai_id ..
>>>
>>> E para ordenar pelo avo, tem de usar with(campo belongs nome pai) ..
>>>
>>> Fica, order_by("pai.pai_id desc")
>>>
>>> Se ainda nao resolveu, ve se isso resolve.
>>>
>>> Enviado via sp android
>>> Em 24/05/2013 11:53, "Paulo Duarte" <[email protected]>
>>> escreveu:
>>>
>>>  hum, foi mau... pai está ligado com avo e não o filho...
>>>> cara, eu nunca teste, mais de repente da para usar with com pai e avo,
>>>> senão tenta com JOIN.
>>>>
>>>> Outra solução é executar a query assim:
>>>>
>>>> $query = "
>>>>                 SELECT
>>>>                     f.id
>>>>                 FROM
>>>>                     filho f,
>>>>                     pai p,
>>>>                     avo a
>>>>                 WHERE
>>>>                     f.pai_id = p.id AND
>>>>                     p.avo_id = a.id
>>>>                 ORDER BY
>>>>                     a.nome,
>>>>                     f.expiration_date,
>>>>                 LIMIT
>>>>                     0, 50";
>>>> $resultado = DB::query(Database::SELECT,$query)->execute();
>>>> foreach($resultado as $r) {
>>>>         $filho = ORM::Factory('filho',$r['id']);
>>>> echo $filho->name;
>>>>  echo $filho->pai->name;
>>>> echo $filho->pai->avo->name;
>>>> }
>>>>
>>>> Você pode para otimizar o tempo já trazer no resultado do select todas
>>>> as informações que quer mostrar, não precisando carregar o filho a cada
>>>> interação... aí fica a seu critério.
>>>> Isso deve resolver.
>>>>
>>>> Abs
>>>>
>>>>
>>>> Atenciosamente,
>>>>
>>>>
>>>> *Paulo Duarte*
>>>> Inteligência Web - Comunicação e Sistemas
>>>>
>>>> Fone: (48) 3028.5141 / 8426.3629
>>>> E-mail: [email protected]
>>>> Skype: paulo.iw
>>>>
>>>>
>>>> -------------------------------------------------------------------------------------------
>>>> Aviso de confidencialidade:
>>>> Esta mensagem da Empresa IW - Inteligência Web Comunicação e Sistemas,
>>>> empresa privada, é enviada exclusivamente a seu destinatário e pode conter
>>>> informações confidenciais, protegidas por sigilo profissional. Sua
>>>> utilização desautorizada é ilegal e sujeita o infrator às penas da lei. Se
>>>> você a recebeu indevidamente, queira, por gentileza, reenviá-la ao
>>>> emitente, esclarecendo o equívoco.
>>>>
>>>>
>>>> Em 24 de maio de 2013 11:33, Fabyo Guimaraes <[email protected]>escreveu:
>>>>
>>>>> Valeu Paulo e Beto
>>>>>
>>>>> eu tentei usar o with e o order by mas esta dando esse erro
>>>>>
>>>>> ErrorException [ 4 ]: syntax error, unexpected '$filhos' (T_VARIABLE) ~ 
>>>>> APPPATH\classes\Controller\Filhos.php [ 20 ]
>>>>>
>>>>> linha 20 : $filhos = ORM::Factory('filho')
>>>>>
>>>>> linha 21 :        ->with('avo')
>>>>>
>>>>>
>>>>>
>>>>> Em 24 de maio de 2013 11:19, Paulo Duarte <
>>>>> [email protected]> escreveu:
>>>>>
>>>>>> Cara, o avô está em outra tabela...
>>>>>> se não me engano você tem q fazer algo assim (se for utilizar ORM):
>>>>>> $filhos = ORM::Factory('filho')
>>>>>>         ->with('avo')
>>>>>> ->offset(0)
>>>>>>  ->limit(50)
>>>>>> ->order_by('filho.expiration_date', 'ASC')
>>>>>>         ->order_by('avo.nome', 'ASC')
>>>>>>  ->find_all();
>>>>>>
>>>>>> Atenciosamente,
>>>>>>
>>>>>>
>>>>>> *Paulo Duarte*
>>>>>> Inteligência Web - Comunicação e Sistemas
>>>>>>
>>>>>> Fone: (48) 3028.5141 / 8426.3629
>>>>>> E-mail: [email protected]
>>>>>> Skype: paulo.iw
>>>>>>
>>>>>>
>>>>>> -------------------------------------------------------------------------------------------
>>>>>> Aviso de confidencialidade:
>>>>>> Esta mensagem da Empresa IW - Inteligência Web Comunicação e
>>>>>> Sistemas, empresa privada, é enviada exclusivamente a seu destinatário e
>>>>>> pode conter informações confidenciais, protegidas por sigilo 
>>>>>> profissional.
>>>>>> Sua utilização desautorizada é ilegal e sujeita o infrator às penas da 
>>>>>> lei.
>>>>>> Se você a recebeu indevidamente, queira, por gentileza, reenviá-la ao
>>>>>> emitente, esclarecendo o equívoco.
>>>>>>
>>>>>>
>>>>>> Em 24 de maio de 2013 10:32, Fabyo <[email protected]> escreveu:
>>>>>>
>>>>>>> Oi Pessoal
>>>>>>>
>>>>>>> eu estava usando o recurso do kohana sobre relacionamento de tabelas
>>>>>>> e estava perfeito, ate que eu precisei ordenar um campo da tabela e deu 
>>>>>>> erro
>>>>>>> estou testando e acho que para ordenar do jeito que eu quero nao vou
>>>>>>> poder usar o modo padrado do kohana
>>>>>>> vou postar um exemplo para voces entenderem melhor
>>>>>>>
>>>>>>> $filhos = ORM::Factory('filho')
>>>>>>> ->offset(0)
>>>>>>> ->limit(50)
>>>>>>>  ->order_by('expiration_date', 'ASC')
>>>>>>> ->find_all();
>>>>>>>
>>>>>>> foreach ($filhos as $filho)
>>>>>>> {
>>>>>>> echo $filho->name;
>>>>>>> echo $filho->pai->name;
>>>>>>>  echo $filho->pai->avo->name;
>>>>>>> }
>>>>>>>
>>>>>>> esse exemplo funciona perfeitamente só que precisei ordenar o nome
>>>>>>> do avo ai que eu percebi um problema
>>>>>>> do jeito que eu estou fazendo acima nao tem como certo?
>>>>>>>
>>>>>>> vou ter que fazer de outra maneira? se for isso blz eu consigo
>>>>>>> fazer, mas só queria uma opniao pra saber se tem como fazer continuando
>>>>>>> usando o exemplo acima
>>>>>>>
>>>>>>> valeu
>>>>>>>
>>>>>>> --
>>>>>>> Você está recebendo esta mensagem porque se inscreveu no grupo
>>>>>>> "Kohana Php" dos Grupos do Google.
>>>>>>> Para cancelar a inscrição neste grupo e parar de receber seus
>>>>>>> e-mails, envie um e-mail para
>>>>>>> [email protected].
>>>>>>> Para postar neste grupo, envie um e-mail para
>>>>>>> [email protected].
>>>>>>> Visite este grupo em
>>>>>>> http://groups.google.com/group/kohana-php?hl=pt-BR.
>>>>>>> Para obter mais opções, acesse
>>>>>>> https://groups.google.com/groups/opt_out.
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>
>>>>>>  --
>>>>>> Você está recebendo esta mensagem porque se inscreveu no grupo
>>>>>> "Kohana Php" dos Grupos do Google.
>>>>>> Para cancelar a inscrição neste grupo e parar de receber seus
>>>>>> e-mails, envie um e-mail para [email protected]
>>>>>> .
>>>>>> Para postar neste grupo, envie um e-mail para
>>>>>> [email protected].
>>>>>> Visite este grupo em
>>>>>> http://groups.google.com/group/kohana-php?hl=pt-BR.
>>>>>> Para obter mais opções, acesse
>>>>>> https://groups.google.com/groups/opt_out.
>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>>  --
>>>>> Você está recebendo esta mensagem porque se inscreveu no grupo "Kohana
>>>>> Php" dos Grupos do Google.
>>>>> Para cancelar a inscrição neste grupo e parar de receber seus e-mails,
>>>>> envie um e-mail para [email protected].
>>>>> Para postar neste grupo, envie um e-mail para
>>>>> [email protected].
>>>>> Visite este grupo em
>>>>> http://groups.google.com/group/kohana-php?hl=pt-BR.
>>>>> Para obter mais opções, acesse
>>>>> https://groups.google.com/groups/opt_out.
>>>>>
>>>>>
>>>>>
>>>>
>>>>  --
>>>> Você está recebendo esta mensagem porque se inscreveu no grupo "Kohana
>>>> Php" dos Grupos do Google.
>>>> Para cancelar a inscrição neste grupo e parar de receber seus e-mails,
>>>> envie um e-mail para [email protected].
>>>> Para postar neste grupo, envie um e-mail para
>>>> [email protected].
>>>> Visite este grupo em http://groups.google.com/group/kohana-php?hl=pt-BR
>>>> .
>>>> Para obter mais opções, acesse https://groups.google.com/groups/opt_out
>>>> .
>>>>
>>>>
>>>>
>>>  --
>>> Você está recebendo esta mensagem porque se inscreveu no grupo "Kohana
>>> Php" dos Grupos do Google.
>>> Para cancelar a inscrição neste grupo e parar de receber seus e-mails,
>>> envie um e-mail para [email protected].
>>> Para postar neste grupo, envie um e-mail para
>>> [email protected].
>>> Visite este grupo em http://groups.google.com/group/kohana-php?hl=pt-BR.
>>> Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
>>>
>>>
>>>
>>
>>
>  --
> Você está recebendo esta mensagem porque se inscreveu no grupo "Kohana
> Php" dos Grupos do Google.
> Para cancelar a inscrição neste grupo e parar de receber seus e-mails,
> envie um e-mail para [email protected].
> Para postar neste grupo, envie um e-mail para [email protected].
> Visite este grupo em http://groups.google.com/group/kohana-php?hl=pt-BR.
> Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
>
>
>

-- 
Você está recebendo esta mensagem porque se inscreveu no grupo "Kohana Php" dos 
Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um 
e-mail para [email protected].
Para postar neste grupo, envie um e-mail para [email protected].
Visite este grupo em http://groups.google.com/group/kohana-php?hl=pt-BR.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.


Responder a