2014-12-01 16 views
5

È possibile impostare la condizione nella sezione join in viaTable? Attualmente ho ottenuto questo:Yii2 condizione di join viaTable

return $this->hasMany(User::className(), ['id' => 'id_user']) 
        ->from(User::tableName()) 
        ->viaTable(RoomActiveUser::tableName(), ['id_room' => 'id'], 
         function($query) { 
         return $query->andWhere(['id_role' => 
           RoleHelper::getConsultantRole()->id]); 
        }); 

ma non è una buona soluzione. Perché? Quando si esegue un aggancio sinistro, la condizione id_role lo renderà effettivamente inner join. La condizione id_role deve essere inserita nella sezione ON della join.

Stavo cercando sul web più ispezionando il codice ma non vedo come potrebbe essere risolto.

risposta

11

ho avuto la risposta dal Qiang Xue - $query->onCondition() deve essere utilizzato per quello che mi serve. Codice risultato:

return $this->hasMany(User::className(), ['id' => 'id_user']) 
        ->from(User::tableName()) 
        ->viaTable(RoomActiveUser::tableName(), ['id_room' => 'id'], 
         function($query) { 
          $query->onCondition(['id_role' => 
          RoleHelper::getConsultantRole()->id]); 
         }); 
0

Hai provato a farlo come

->viaTable(RoomActiveUser::tableName(), ['id_room' => 'id', 'id_role' => RoleHelper::getConsultantRole()->id]) 

Questo dovrebbe creare un JOIN X on 'id_room' = 'id' AND 'id_role' = '$ConsultantRole_id'

+0

No. Vi dirà che non esiste un id di colonna o nessuna colonna 1 (se id è 1). Ho ricevuto la risposta di Qiang Xue, fondatore di Yii. Posterò la risposta – Joe

+0

sì, sembra giusto. Ricordo che qualche tempo fa ho avuto un problema simile. L'ho risolto creando una relazione parametrica alla fine. –

+0

Penso che questo possa essere facilmente risolto dividendo le condizioni e usando dopo l'istruzione viaTable -> onCondition (['id_role' => RoleHelper :: getConsultantRole() -> id]) – Salaros

Problemi correlati