Hi every one. I try for many weeks get a value from hasMany relationship through of pivot table.
See the image 1 (schema.png) I want the result as the image 2 (processo-grid.png).
My pivot table is "MacroprocessoArea" I want get the Area name through "processo" GridView and DetailView.
In GridView I try to use: ‘value’ => ‘macroprocessoAreas.NAME’, ‘value’ => ‘macroprocessoAreas.area.SIGLA’, ‘value’ => ‘macroprocesso.macroprocessoAreas.area.SIGLA’, and ‘macroprocesso.macroprocessoAreas.SIGLA’.
My model Processo is:
public function getMacroprocessoAreas()
{
return $this->hasMany(MacroprocessoArea::className(), ['PROCESSO_ID' => 'ID'])->via(macroprocesso);
}
/**
* @return \yii\db\ActiveQuery
*/
public function getMacroprocesso()
{
return $this->hasOne(Macroprocesso::className(), ['ID' => 'MACROPROCESSO_ID']);
}
ProcessoSearch.php
public function search($params)
{
$query = Processo::find();
$dataProvider = new ActiveDataProvider([
'query' => $query,
]);
$dataProvider->setSort([
'defaultOrder' => [
'AREA_ID' => SORT_ASC,
'MACROPROCESSO_ID' => SORT_ASC,
'PROCESSO' => SORT_ASC,
],
'attributes' => [
'AREA_ID' => [
'asc' => ['SIGLA' => SORT_ASC],
'desc' => ['SIGLA' => SORT_DESC],
'default' => SORT_ASC,
],
'MACROPROCESSO_ID' => [
'asc' => ['MACROPROCESSO' => SORT_ASC],
'desc' => ['MACROPROCESSO' => SORT_DESC],
],
'PROCESSO'
],
]);
$this->load($params);
if (!$this->validate()) {
// uncomment the following line if you do not want to return any records when validation fails
// $query->where('0=1');
return $dataProvider;
}
$query->select("AUT.AUT_SETORES.SIGLA as CU, SGR_PROCESSO.ID, SGR_PROCESSO.PROCESSO, SGR_PROCESSO.MACROPROCESSO_ID");
/**
* Jaz um join com o relacionamento que exite no model.
* Dessa forma traz somente o(s) campo(s) que interessam na query
* Caso queira trazer tudo bas usar
* $query->joinWith('nomeDoRelacionamento')
*/
$query->joinWith('macroprocessoAreas');
$query->innerJoin('AUT.AUT_SETORES', 'AUT.AUT_SETORES.ID = SGR_MACROPROCESSO_AREA.AREA_ID');
$query->andFilterWhere([
'ID' => $this->ID,
//A chave estrangeira precisa ser retirada
//'MACROPROCESSO_ID' => $this->MACROPROCESSO_ID,
]);
$query->andFilterWhere(['like', 'UPPER(PROCESSO)', strtoupper($this->PROCESSO)])
->andFilterWhere(['like', 'UPPER(SGR_MACROPROCESSO.MACROPROCESSO)', strtoupper($this->MACROPROCESSO_ID)])
->andFilterWhere(['like', 'UPPER(AUT.AUT_SETORES.SIGLA)', strtoupper($this->AREA_ID)]);
return $dataProvider;
}
The code generated by ProcessoSearch.php runs as I want in Oracle Interface. Why I can’t show it?
I dont’t know what do anymore.