Ah tá .. vc tá usando varias tabelas ..

o que tentei explicar era algo +/- assim .. feito de cabeça

https://gist.github.com/felipebastosweb/5646351


Em 24 de maio de 2013 14:15, Douglas J.A.M <[email protected]> escreveu:

> 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.
>
>
>



-- 
http://agilesocial.net
http://twitter.com/felipebastosweb
http://facebook.com/felipebastosweb

-- 
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