2015-09-28 25 views
6

Yii 2 İlişki Tabloları ile ilgili bir sorun yaşıyorum. İşim çok ilişki vardır, ama sadece bu durumda bana bir hata döndürür:Yii 2: aynı tabloyla çoklu ilişki

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'father.name' in 'where clause'

Sorun aynı Tablo "Ajan" çift ilişkisi olduğunu düşünüyorum. modeldeki kod parçasını bakınız: Benim GridView içinde

public function getAgent() 
{ 
    return $this->hasOne(Agent::className(), ['id' => 'id_agent']); 
} 
public function getFather() 
{ 
    return $this->hasOne(Agent::className(), ['id' => 'id_father']); 
} 

Ben doğru değerleri görüyorum, ama SİPARİŞ ile veya "andWhere" ile filtre çalıştığınızda, Yii2 hata verir. AgentName niteliklerini

$dataProvider->sort->attributes['agentName'] = [ 
     'asc' => ['agent.name' => SORT_ASC], 
     'desc' => ['agent.name' => SORT_DESC], 
     'default' => SORT_ASC 
    ]; 

$dataProvider->sort->attributes['fatherName'] = [ 
     //'asc' => ['father.name' => SORT_ASC], 
     //'desc' => ['father.name' => SORT_DESC], 
     'default' => SORT_ASC 
    ]; 
//....... 
$query->andFilterWhere(['like', 'agent.name', $this->agentName]); 
$query->andFilterWhere(['like', 'father.name', $this->fatherName]); 

çalışıyor: Aşağıda

searchModel için kod parçasını bulabilirsiniz. Herhangi bir öneri? Teşekkür ederiz!

------- GÜNCELLEME: Daha fazla kod --------- searchModel:

public function search($params) 
{ 
    $agent_aux = new Agent(); 
    $agent_id= $agent_aux->getAgentIdFromUser(); 

    if (Yii::$app->user->can('admin')){ 
     $query = Contract::find(); 
    } 
    else{ 

     $query = Contract::find()->where(['contract.agent_id' => $agent_id]);    
    } 

    $query->joinWith(['agent','seminar']); 

    $dataProvider = new ActiveDataProvider([ 
     'query' => $query, 
    ]); 
    $this->load($params); 
    $dataProvider->sort->attributes['seminar_location'] = [ 
     'asc' => ['seminar.location' => SORT_ASC], 
     'desc' => ['seminar.location' => SORT_DESC], 
    ]; 
    $dataProvider->sort->attributes['agentName'] = [ 
     'asc' => ['agent.name' => SORT_ASC], 
     'desc' => ['agent.name' => SORT_DESC], 
     'default' => SORT_ASC 
    ]; 

    $dataProvider->sort->attributes['fatherName'] = [ 
     //'asc' => ['father.name' => SORT_ASC], 
     //'desc' => ['father.name' => SORT_DESC], 
     'default' => SORT_ASC 
    ]; 
    if (!$this->validate()) { 
     return $dataProvider; 
    } 
    $query->andFilterWhere([ 
     'id' => $this->id, 
     'data' => $this->data, 
     'id_agent' => $this->id_agent, 
     'id_father' => $this->id_father, 
     'id_seminar' => $this->id_seminar, 
    ]); 
    $query->andFilterWhere(['like', 'agent.name', $this->agentName]); 
    $query->andFilterWhere(['like', 'father.name', $this->fatherName]); 
    return $dataProvider; 
} 
+0

Yanlış yazılmış sütun adınız olabilir mi? –

+0

@InsaneSkulll "aracı" sütun adı olarak kullanıyorum (şimdi "baba" kullanıyorum, ilişkinin adı) arama ilk ilişkiyle verileri filtreler (Ajan):/ – garsim

+0

Satır var $ sorgu-> ile (['ajan', 'baba']) ya da böyle bir şey? Sorgunun tam kaynağını gösterebilir misiniz? – robsch

cevap

13

Sen modelinde değişiklik aşağıdakileri yapmanız gerekir. cümleden aslında bir takma ad oluşturuyor. Ayrı birleşme hükmünde madde ve baba ilişkisi ele alınacaktır. Filtre ölçütlerinizdeki "agent" ve "father" takma adlarını sütun adları ile birlikte kullanın. değiştirmek için

public function getAgent() 
{ 
    return $this->hasOne(Agent::className(), ['id' => 'id_agent'])->from(['agent' => Agent::tableName()]); 
} 

public function getFather() 
{ 
    return $this->hasOne(Agent::className(), ['id' => 'id_father'])->from(['father' => Agent::tableName()]) 
} 

Başka bir şey yaptığınızı takma tanımlamak olabilir

$query->joinWith(['agent','seminar', 'father']); 
+0

İyi! Çalışıyor :) Teşekkür ederiz! – garsim

1

@FidoXLNC verilen yanıta alternatif katılmak:

$query->joinWith([ 
    'seminar', 
    'agent' => function ($q) { $q->from(Agent::tableName() . ' agent'); }, 
    'father' => function ($q) { $q->from(Agent::tableName() . ' father'); } 
]); 

Ama AFAIK sadece bir tane değil, her iki ilişkiyi de belirtmelisiniz.