2015-10-13 9 views
8

controller che ho:Yii2 selezionare solo alcune colonne dal modello relativo

public function actionGetItems() 
{ 
    $model = new \app\models\WarehouseItems; 
    $items = $model->find()->with(['user'])->asArray()->all(); 
    return $items; 
} 

Nel modello WarehouseItem ho standard di dichiarazione (creato da GII) relazione:

public function getUser() 
{ 
    return $this->hasOne('\dektrium\user\models\User', ['user_id' => 'user_id']); 
} 

come posso controllare quale colonna i dati ottengo dalla relazione "utente"? Attualmente ottengo tutte le colonne che non sono buone in quanto i dati vengono inviati ad Angular in formato JSON. In questo momento devo fare un ciclo con gli articoli $ ed estrarre tutte le colonne che non voglio inviare.

risposta

12

Si deve semplicemente modificare la query relazione in questo modo:

$items = \app\models\WarehouseItems::find()->with([ 
    'user' => function ($query) { 
     $query->select('id, col1, col2'); 
    } 
])->asArray()->all(); 

Per saperne di più: http://www.yiiframework.com/doc-2.0/yii-db-activequerytrait.html#with()-detail

+1

ottengo questo errore: PHP Notice - Yii \ base \ ErrorException Undefined index: user_id Cosa potrebbe essere? – Ljudotina

+1

Oh, ok ho capito .... devo selezionare anche la colonna "user_id" dalla tabella correlata. – Ljudotina

+1

Per funzionare è necessario anche selezionare il campo di collegamento della classe correlata. In questo caso sarebbe 'user_id' del modello' User': '$ query-> select ('user_id, col1, col2');'. –

0

Il codice dovrebbe andare in questo modo.

public function actionGetItems() 
{ 
    $items = \app\models\WarehouseItems::find() 
     ->joinWith([ 
      /* 
       *You need to use alias and then must select index key from parent table 
       *and foreign key from child table else your query will give an error as 
       *undefined index **relation_key** 
       */ 
      'user as u' => function($query){ 
       $query->select(['u.user_id', 'u.col1', 'u.col2']); 
      } 
     ]) 
     ->asArray() 
     ->all(); 

    return $items; 
}