Dúvidas com Relations

32 views
Skip to first unread message

Cálcio

unread,
Jun 6, 2016, 2:11:17 PM6/6/16
to YFB - Yii Framework Brasil
Boa tarde.

Preciso pegar uma relação de terceiro nível (Não sei se é assim q é falado), mas explico.

Tenho uma tabela Area que faz relação com a Tabela Macropocesso essa tabela Macropocesso faz relação com a tabela Processo.
Porém na grid de listagem de Processos preciso adicionar a coluna Area. 

Há alguma forma de fazer isso? 

Inicialmente pensei em usar a relação que já existe entre Area e Macroprocesso, uma vez que a tabela Processo faz relação com Macroprocesso. 

Eric

unread,
Jun 6, 2016, 2:14:41 PM6/6/16
to yii-framew...@googlegroups.com
Fala Cálcio,

vc tentou $model->macroProcesso->area->campo....
?

ou na gridView:
[
    'campo1',
    'macroProcesso.area.campo',
    ...
]

Você falou que o model tem o relation, então o código deve funcionar.

Eric Maicon - ericmaicon.com.br


--
Yii Framework Brasil
#######################################################################
 
Ao solicitar ajuda:
1. Explique o problema ou dificuldade. Seja específico!
2. Explique o que você *já tentou fazer* para resolver a situação;
3. MOSTRE CÓDIGO, sempre que possível. Esta é uma lista de programação!
 
LEMBRE-SE: se você tiver preguiça até para formular sua pergunta os
participantes da lista terão "preguiça" de respondê-la.
 
#######################################################################
 
04/2011: Anexos foram autorizados em votação. Use com moderação!
.
-
--
---
Você recebeu essa mensagem porque está inscrito no grupo "YFB - Yii Framework Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para yii-framework-br...@googlegroups.com.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/yii-framework-brasil/eb8cf14f-cd17-40bc-b863-13dcb20a39a8%40googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Cálcio

unread,
Jun 6, 2016, 2:17:55 PM6/6/16
to YFB - Yii Framework Brasil, er...@ericmaicon.com.br
Valeu Eric vou tentar aqui,
Eu tinha tentado de algumas outras formas

[
'label' => 'Area',
'attribute' => 'MACROPROCESSO_ID',
'value' => 'macroprocesso.ID.area.SIGLA',
],

Eric

unread,
Jun 6, 2016, 2:20:29 PM6/6/16
to yii-framew...@googlegroups.com
O que seria esse ID?

Se você tem o getMacroprocesso no model processo, você pode fazer simplesmente:

macroprocesso....

Ele vai acessar o model MacroProcesso, então se vc tem getArea nele, você pode já chamar direto também. Se você vai usar o value, então pode chamar um closure:

'value' => function ($model) {
   return $model->macroprocesso->area;
}

Só cuidado com performance!!!


Eric Maicon - ericmaicon.com.br


--
Yii Framework Brasil
#######################################################################
 
Ao solicitar ajuda:
1. Explique o problema ou dificuldade. Seja específico!
2. Explique o que você *já tentou fazer* para resolver a situação;
3. MOSTRE CÓDIGO, sempre que possível. Esta é uma lista de programação!
 
LEMBRE-SE: se você tiver preguiça até para formular sua pergunta os
participantes da lista terão "preguiça" de respondê-la.
 
#######################################################################
 
04/2011: Anexos foram autorizados em votação. Use com moderação!
.
-
--
---
Você recebeu essa mensagem porque está inscrito no grupo "YFB - Yii Framework Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para yii-framework-br...@googlegroups.com.

Cálcio

unread,
Jun 6, 2016, 2:21:29 PM6/6/16
to YFB - Yii Framework Brasil, er...@ericmaicon.com.br
Tentei como falou mas ñ exibe nada.

[
'label' => 'Area',
'attribute' => 'MACROPROCESSO_ID',
'value' => 'macroprocesso.area.NOME',
],

Precisa lá no na relation mudar alguma coisa?
Estava tentando fazer usando o viaTable() direto na relation mas ñ estava rolando tb.

Eric

unread,
Jun 6, 2016, 2:25:27 PM6/6/16
to yii-framew...@googlegroups.com
Posta o códigos dos 2 models por favor. (http://pastebin.com ou gist). Posta o código da chamada também.

1. Se vc fez Model::find()->...e está usando activeDataProvider, independente de ser eager ou lazy ele vai carregar os dados do relation. Só vai interferir na performance.
2. Seu campo é tudo maiúsculo mesmo?
3. Você não precisa desse attribute, a não ser que vc esteja usando para definir sort ou coisa no tipo no seu data provider.

Espero o código pra tentar te ajudar um pouco melhor. 

Eric Maicon - ericmaicon.com.br


--
Yii Framework Brasil
#######################################################################
 
Ao solicitar ajuda:
1. Explique o problema ou dificuldade. Seja específico!
2. Explique o que você *já tentou fazer* para resolver a situação;
3. MOSTRE CÓDIGO, sempre que possível. Esta é uma lista de programação!
 
LEMBRE-SE: se você tiver preguiça até para formular sua pergunta os
participantes da lista terão "preguiça" de respondê-la.
 
#######################################################################
 
04/2011: Anexos foram autorizados em votação. Use com moderação!
.
-
--
---
Você recebeu essa mensagem porque está inscrito no grupo "YFB - Yii Framework Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para yii-framework-br...@googlegroups.com.

Cálcio

unread,
Jun 6, 2016, 2:32:40 PM6/6/16
to YFB - Yii Framework Brasil, er...@ericmaicon.com.br
Segue o link do Pastebin. Coloquei os 3 models no msm paste.


1) Estou usando o dataProvider padrão gerado pelo Yii  na view;

2) Sim é maiúsculo pq estou usando com Oracle;


Cálcio

unread,
Jun 6, 2016, 3:55:32 PM6/6/16
to YFB - Yii Framework Brasil, er...@ericmaicon.com.br
Comportamento bizonho...

No index (view) o relacionamento proposto ñ funciona, porem no view (view) usando $model->macroprocesso->area->NOME funciona.

Newerton Vargas de Araújo

unread,
Jun 6, 2016, 9:16:49 PM6/6/16
to YFB - Yii Framework Brasil, er...@ericmaicon.com.br
Cálcio,

Se o Model principal é Processo, o correto seria:

[
'attribute' => 'macroprocesso.area.NOME',
'value' => function($data){
return $data->macroprocesso->area->NOME;
}
]

Cálcio

unread,
Jun 7, 2016, 8:46:12 AM6/7/16
to YFB - Yii Framework Brasil, er...@ericmaicon.com.br
Brother nem assim consegui.

Precisa fazer alguma modificação no model lá nos relations?

Eric

unread,
Jun 7, 2016, 8:50:16 AM6/7/16
to yii-framew...@googlegroups.com
Cálcio, 

Já tentou minúsculo? Eu sei que seu campo é maiúsculo, e teoricamente tá tudo certo. Mas eu lembro no Yii1 de ter algum problema relacionado à uppercase com Oracle. Um brother mexeu dentro do FW pra resolver. Não sei se resolveram no Yii2 ou algo do tipo. Acho que inclusive tinha uma config pra isso. 

Bom, é um chute, eu teria q botar a mão no código pra descobrir o erro, olhando tudo q vc me passou, não tenho outra solução.

Eric Maicon - ericmaicon.com.br


Em 7 de junho de 2016 09:46, Cálcio <calc...@gmail.com> escreveu:
Brother nem assim consegui.

Precisa fazer alguma modificação no model lá nos relations?

--
Yii Framework Brasil
#######################################################################
 
Ao solicitar ajuda:
1. Explique o problema ou dificuldade. Seja específico!
2. Explique o que você *já tentou fazer* para resolver a situação;
3. MOSTRE CÓDIGO, sempre que possível. Esta é uma lista de programação!
 
LEMBRE-SE: se você tiver preguiça até para formular sua pergunta os
participantes da lista terão "preguiça" de respondê-la.
 
#######################################################################
 
04/2011: Anexos foram autorizados em votação. Use com moderação!
.
-
--
---
Você recebeu essa mensagem porque está inscrito no grupo "YFB - Yii Framework Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para yii-framework-br...@googlegroups.com.

Cálcio

unread,
Jun 7, 2016, 9:00:05 AM6/7/16
to YFB - Yii Framework Brasil, er...@ericmaicon.com.br
Bom dia Eric.
Nem colocando minusculo. 

Todas as as views as chamadas normais as propriedades do model são em maiúsculo.


Cálcio

unread,
Jun 7, 2016, 9:08:26 AM6/7/16
to YFB - Yii Framework Brasil, er...@ericmaicon.com.br
Newerton esse $data aí nessa closure é criada só pra ela msm né?

Ele está retornando o erro

PHP Notice yii\base\ErrorException            


               

Trying to get property of non-object



Eric

unread,
Jun 7, 2016, 9:11:05 AM6/7/16
to yii-framew...@googlegroups.com
Opa, essa aí é uma boa dica...
Acontece que não é o $data que está vazio, pode ser o $data->macroprocesso ou $data->macroprocesso->area, o q demonstra que pode ser o relation ou até mesmo seu campo de relacionamento que está vazio.

Checa com um var_dump mesmo, se não tiver o debug instalado.

Eric Maicon - ericmaicon.com.br


--
Yii Framework Brasil
#######################################################################
 
Ao solicitar ajuda:
1. Explique o problema ou dificuldade. Seja específico!
2. Explique o que você *já tentou fazer* para resolver a situação;
3. MOSTRE CÓDIGO, sempre que possível. Esta é uma lista de programação!
 
LEMBRE-SE: se você tiver preguiça até para formular sua pergunta os
participantes da lista terão "preguiça" de respondê-la.
 
#######################################################################
 
04/2011: Anexos foram autorizados em votação. Use com moderação!
.
-
--
---
Você recebeu essa mensagem porque está inscrito no grupo "YFB - Yii Framework Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para yii-framework-br...@googlegroups.com.

Cálcio

unread,
Jun 7, 2016, 9:31:44 AM6/7/16
to YFB - Yii Framework Brasil
Eric segue meu dump;


Mas ainda sim acho bizonho ñ funcionar no index.php e funcionar no view.php

Eric

unread,
Jun 7, 2016, 9:33:56 AM6/7/16
to yii-framew...@googlegroups.com
Sorry, não dá pra ver pelo dump. Não tem o models aí.

Vá dentro do closure e faz os 2 var_dumps q te falei, vc mesmo vai ver qd está NULL. Esse erro q vc postou dá quando vc tenta acessar algo de uma variável NULL, de um objeto que não tem o q vc está querendo.

Eric Maicon - ericmaicon.com.br


--
Yii Framework Brasil
#######################################################################
 
Ao solicitar ajuda:
1. Explique o problema ou dificuldade. Seja específico!
2. Explique o que você *já tentou fazer* para resolver a situação;
3. MOSTRE CÓDIGO, sempre que possível. Esta é uma lista de programação!
 
LEMBRE-SE: se você tiver preguiça até para formular sua pergunta os
participantes da lista terão "preguiça" de respondê-la.
 
#######################################################################
 
04/2011: Anexos foram autorizados em votação. Use com moderação!
.
-
--
---
Você recebeu essa mensagem porque está inscrito no grupo "YFB - Yii Framework Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para yii-framework-br...@googlegroups.com.

Cálcio

unread,
Jun 7, 2016, 9:38:12 AM6/7/16
to YFB - Yii Framework Brasil, er...@ericmaicon.com.br
Tem o paste de ontem com os models: http://pastebin.com/faQ0LzFr


Cálcio

unread,
Jun 7, 2016, 9:59:21 AM6/7/16
to YFB - Yii Framework Brasil, er...@ericmaicon.com.br
Realmente o dump da closure ñ traz nada relação de Area com Macroprocesso, Vai no máximo até Macroprocesso.

Não sei se esse dump ajuda, mas mostra até onde vai os resultados da consulta.

[yii\db\BaseActiveRecord:_attributes] => [
       
'ID' => '306'
       
'MACROPROCESSO_ID'
=> '277'
       
'PROCESSO'
=> 'teste'
   
]
   
[
yii\db\BaseActiveRecord:_oldAttributes] => [
       
'ID' => '306'
       
'MACROPROCESSO_ID'
=> '277'
       
'PROCESSO'
=> 'teste'
   
]
   
[
yii\db\BaseActiveRecord:_related] => [
       
'macroprocesso' => app\models\Macroprocesso#2
       
(
           
[
yii\db\BaseActiveRecord:_attributes] => [
               
'ID' => '277'
               
'MACROPROCESSO'
=> 'Gestão de investimento'
           
]
           
[
yii\db\BaseActiveRecord:_oldAttributes] => [
               
'ID' => '277'
               
'MACROPROCESSO'
=> 'Gestão de investimento'
           
]
           
[
yii\db\BaseActiveRecord:_related] => []
           
[
yii\base\Model:_errors] => null
           
[yii\base\Model:_validators] => null
           
[yii\base\Model:_scenario] => 'default'
           
[yii\base\Component:_events] => []
           
[
yii\base\Component:_behaviors] => []
       
)
   
]



Cálcio

unread,
Jun 14, 2016, 11:01:08 AM6/14/16
to YFB - Yii Framework Brasil, er...@ericmaicon.com.br

Só para dar um contexto visual da parada.


No arquivo index.php (view) de processo, preciso pegar a Área que está relacionada em Macroprocesso. Esse widget dos infernos não me deixa fazer links de relações como por exemplo o arquivo view.php (view) de processos deixa. Ou seja, preciso fazer um link direto de Processo com Area, usando a relação que já existe entre Macroprocesso e area.


O @AndroidLP que tb está aqui sugeriu o seguinte: http://www.yiiframework.com/forum/index.php/topic/71156-duvidas-com-relations/#entry300603


Mas não consegui implementar. 



Cálcio

unread,
Jun 14, 2016, 2:16:39 PM6/14/16
to YFB - Yii Framework Brasil
Finalmente consegui resolver esse troço tosco. Aproveitei a ideia do @AndroideLP + a DOC do Yii para conseguir acertar a query gerada. Segue a resolução que consegui.

Model: ProcessoSearch.php - Método search():
...
$query->joinWith([
            'macroprocesso' => function($join)
            {
                $join->join('LEFT JOIN', 'AUT_SETORES', 
                    'SGR_MACROPROCESSO.AREA_ID = AUT_SETORES.ID');
            },
        ]);
...

Adicionei um joinWith chamando meu relacionamento e dentro dele criei um outro join. Onde macroprocesso é o nome/chamada da minha relation.

Na index.php view faço a chama no widget da seguinte forma:
[
    'label' => 'Área',
    'value' => 'macroprocesso.area.SIGLA',
],

Porém ainda estou com 2 bugs que no momento não me atrapalham. 
  1. Não consigo fazer um select, para trazer somente os campos que preciso;
  2. Não consigo usar o andFilterWhere() para que o campo consiga ser pesquisado no widget;

Cálcio

unread,
Jun 14, 2016, 2:22:08 PM6/14/16
to YFB - Yii Framework Brasil
Putz foi sem os outros agradecimentos... Foi mal galera..

Valeu pelo apoio @Eric e @Newerton pela contribuição tb. Fui reunindo as ideias e consegui chegar a uma solução.

Espero que esse post possa ajudar mais pessoas.

Caso tenha uma forma mais elegante e correta, peço que poste aqui.

[]'
Cálcio

Sidney

unread,
Jun 14, 2016, 5:42:17 PM6/14/16
to yii-framew...@googlegroups.com
Tentei acessar os pastebins que você postou aqui mas estão fora.

Tá estranho isso aí, cara, porque aqui acesso tudo no gridview como te orientaram e funciona normalmente. 

Exemplo onde o dataProvider é um AR SpeecherInvitation que hasOne Assignment que, por sua vez, hasOne member:
<?= GridView::widget([
'dataProvider' => $dataProviderOnlyReceived,
'filterModel' => $searchModel,
'columns' => [
['class' => 'yii\grid\SerialColumn'],

[
'label' => 'Date',
'value' => 'assignment.date',
],
[
'label' => 'Member',
'value' => 'assignment.member.name',
],
Minha relação hasOne `assignment` é normal:

/**
* @return \yii\db\ActiveQuery
*/
public function getAssignment()
{
return $this->hasOne(Assignment::className(), ['id' => 'assignment_id']);
}
E funciona no grid sem precisar de nenhum join. 

No seu caso eu tentaria debugar o DataColumn::getDataCellValue() pra ver como o grid tá recebendo seus dados e o que ele está fazendo ao tentar gerar os resultados.

Mas que bom que achou uma saída.

Atenciosamente,
Sidney Lins
------

--
Yii Framework Brasil
#######################################################################
 
Ao solicitar ajuda:
1. Explique o problema ou dificuldade. Seja específico!
2. Explique o que você *já tentou fazer* para resolver a situação;
3. MOSTRE CÓDIGO, sempre que possível. Esta é uma lista de programação!
 
LEMBRE-SE: se você tiver preguiça até para formular sua pergunta os
participantes da lista terão "preguiça" de respondê-la.
 
#######################################################################
 
04/2011: Anexos foram autorizados em votação. Use com moderação!
.
-
--
---
Você recebeu essa mensagem porque está inscrito no grupo "YFB - Yii Framework Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para yii-framework-br...@googlegroups.com.

Cálcio

unread,
Jun 15, 2016, 8:01:43 AM6/15/16
to YFB - Yii Framework Brasil
Sidney, qual o conteúdo do seu $dataproviderOnlyReceived?

No seu caso Member está relacionado (hasOne) com Assignment?

Eu tentei do jeito que falaram, minha relação tb é hasOne e a coluna vem vazia. Não sei se é frescura por eu usar oracle, ou da lib q uso para o Oracle funcionar já q ele ñ é nativo.

Cálcio

unread,
Jun 15, 2016, 8:20:42 AM6/15/16
to YFB - Yii Framework Brasil
Bom eu consegui achar o motivo do meu erro.

No meu modelSearch para não usar o lazyLoad eu usei o joinWith() usando um select.
$query->joinWith([
            'processo' => function($join)
            {
                $join->select(['ID', 'PROCESSO']);
//                $join->join('LEFT JOIN', 'SGR_MACROPROCESSO', 
//                    'SGR_PROCESSO.MACROPROCESSO_ID = SGR_MACROPROCESSO.ID');
//                $join->join('LEFT JOIN', 'AUT_SETORES', 
//                    'SGR_MACROPROCESSO.AREA_ID = AUT_SETORES.ID');
            },

Esse select é q omitia os campos, qnd tiro funciona. O problema que eu preciso desse select, para ele ñ encher de lixo meu array. 

Qnd eu tento chamar os campos das outras tabelas ele dá erro pq ñ reconhece os campos.

Sidney

unread,
Jun 15, 2016, 12:53:27 PM6/15/16
to yii-framew...@googlegroups.com
Entendi. Mas nesse caso então não parece ser exatamente "lixo" que você está tirando, certo? :) Tá saindo coisa que seria necessária. Bom mas você já matou a questão.


Atenciosamente,
Sidney Lins
------

--
Yii Framework Brasil
#######################################################################
 
Ao solicitar ajuda:
1. Explique o problema ou dificuldade. Seja específico!
2. Explique o que você *já tentou fazer* para resolver a situação;
3. MOSTRE CÓDIGO, sempre que possível. Esta é uma lista de programação!
 
LEMBRE-SE: se você tiver preguiça até para formular sua pergunta os
participantes da lista terão "preguiça" de respondê-la.
 
#######################################################################
 
04/2011: Anexos foram autorizados em votação. Use com moderação!
.
-
--
---
Você recebeu essa mensagem porque está inscrito no grupo "YFB - Yii Framework Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para yii-framework-br...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages