我使用外键来从一个表中获取数据库值而不是另一个表,例如这个......
public function getAuthor() {
return $this->hasOne(SiteUsers::className(), ['id' => 'authorId']);
}
...或CRUD视图文件中的匿名函数,例如:
<?= 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'],
],
]); ?>
现在,问题是:一种方法比另一种更有效吗?为什么?
答案 0 :(得分:1)
您必须考虑到,如果您使用activeRecord,则无论如何都会执行关系getAuthor()
,并且这是针对dataProvider中涉及的每个模型执行的。
通常,直接访问比基于ORM的访问更快。并且在渲染èphase中执行的匿名函数的访问基本上等同于通过关系执行的访问。最佳性能基于直接命令避免ORM或activeRecord建模。但这意味着ORM授予的抽象级别的丢失。
请记住,如果您同时拥有(关系和匿名函数),则执行两次查询..