Dúvidas com Relations

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.

Estou tentando usar isso no index.php


[

'label' => 'Área',

'value' => 'macroprocesso.area.NOME',

],

mas não está funcionando, bizarramente no arquivo view.php se usar $model->macroprocesso->area->SIGLA funciona.

vc fez o relacionamento no seu modelo?

Verifica se a consulta está com a relação, imaginando que você usa yii2 podemos fazer o search para gridview desta maneira




// em seu model

public function search()

{

   $query = MyModel::find()->joinWith(['minhaprimeirarelacao'=>function($q){

     $q->where(['minhaprimeirarelacao.user_id'=>(int)$this->id);

    },

     'minhaprimeirarelacao.meusegundonivel'

    ]);


$dataProvider = new ActiveDataProvider([

          'query' => $query,

      ]);


   return $dataProvider;


}







// controller

public function actionIndex()

{

   $dataProvider= MyModel::search();


  return $this->render('index',[

    'dataProvider'=>$dataProvider

  ]);


}







// sua view

<?= GridView::widget([

              'id'=>'grid-content',

              'dataProvider' => $dataProvider,

'columns' => [

 [

'attribute' => 'Status',

                        'format' => 'html',

                        'value'=>function($data){

                              return Html::tag('span',$data->minhaprimeirarelacao->meusegundonivel->nome);

                         


                        }

]

]



Acho que é isso que precisa

Não consegui entender bem oq propôs.

No meu modelSearch o $this ñ vem oq eu preciso para montar a relação, as chaves vem nulas.Fiquei perdido tb oq seria o ‘minhaprimeirarelação’ ela é o que já existe no relation, ou seja, a relação com Macroprocesso, já que estamos falando de Pocessos, ou seria Area q é a relação existente em Macroprocesso?

Oq eu preciso é: Na index (view) de Processo, quero a relação que existe em Macroprocesso com Area. basicamente preciso dessa query (join)

Retificando minha query


SELECT DISTINCT M.MACROPROCESSO, A.SIGLA 

FROM SGR_PROCESSO P

INNER JOIN SGR_MACROPROCESSO M ON M.ID = P.MACROPROCESSO_ID

INNER JOIN AUT_SETORES A ON A.ID = M.AREA_ID;

Para que a grid de Processo, consiga enxergar Area.

6999

relacao-macroprocesso-area.png

para poder entender melhor segue uma imagem em anexo. Vale lembrar que preciso dessa relação na view referente a Processo.

Se puder dar uma força, agradeço.

Finalmente consegui resolver esse troço tosco. Aproveitei a ideia do @AndroideLP + a DOC do Yii + uma galera do GRUPO Yii Framework Brasil no google, 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.

  • Não consigo fazer um select, para trazer somente os campos que preciso;

  • Não consigo usar o andFilterWhere() para que o campo consiga ser pesquisado no widget;

Valeu galera

Problema resolvido com a ajuda do @Eric.

Bastou criar um campo chamado $SIGLA que o valor foi exibido.

Valeu galera