2017-06-11 1 views
2

verwendete ich den Fremdschlüssel, um Datenbankwerte aus einer Tabelle über einen anderen, wie dies ...Yii2 Effizienz - Fremdschlüssel oder anonyme Funktion in Sicht?

public function getAuthor() { 
    return $this->hasOne(SiteUsers::className(), ['id' => 'authorId']); 
} 

... oder anonyme Funktionen zu erhalten, innerhalb der CRUD View-Dateien, wie zB:

<?= GridView::widget([ 
     'dataProvider' => $dataProvider, 
     'filterModel' => $searchModel, 
     'columns' => [ 
      ['class' => 'yii\grid\SerialColumn'], 

      //'id', 

      'hotel_id' => [ 
       'attribute' => 'hotel_id', 
       'value' => function ($value) { 
        return \common\models\Hotels::find() 
        ->where(['id' => $value->hotel_id]) 
        ->one()['name']; 
       } 
      ], 

      'country_id' => [ 
       'attribute' => 'country_id', 
       'value' => function ($value) { 
        return \common\models\Countries::find() 
        ->where(['id' => $value->country_id]) 
        ->one()['name']; 
       } 
      ], 

      'room_type', 
      'max_persons', 

      ['class' => 'yii\grid\ActionColumn'], 
     ], 
    ]); ?> 

Nun ist die Frage: ist ein Verfahren effizienter als die anderen? Und warum?

Antwort

1

Sie müssen berücksichtigen, dass bei Verwendung von activeRecord die Beziehung getAuthor() auf jeden Fall ausgeführt wird, und dies wird für jedes Modell durchgeführt, das an dataProvider beteiligt ist.

Im Allgemeinen den direkten Zugriff ist immer schnell, dass der ORM Zugang basiert. Und der Zugriff durch die anonyme Funktion, die in der Rendering-Phase ausgeführt wird, entspricht im Wesentlichen dem durch die Relation durchgeführten Zugriff. Die beste Leistung basiert auf einem direkten Befehl, der eine ORM- oder ActiveRecord-Modellierung vermeidet. aber das bedeutet den Verlust des von ORM gewährten Abstraktionsniveaus. Denken Sie daran,

dass, wenn Sie beide (Beziehung eine anonyme Funktion) können Sie die Abfrage zweimal ausführen ..

+0

Okay, ich glaube, ich habe dich. Danke vielmals. –