Yii2效率 - 视图中的外键还是匿名功能?

时间:2017-06-11 19:00:02

标签: php database performance activerecord yii2

我使用外键来从一个表中获取数据库值而不是另一个表,例如这个......

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'],
        ],
    ]); ?>

现在,问题是:一种方法比另一种更有效吗?为什么?

1 个答案:

答案 0 :(得分:1)

您必须考虑到,如果您使用activeRecord,则无论如何都会执行关系getAuthor(),并且这是针对dataProvider中涉及的每个模型执行的。

通常,直接访问比基于OR​​M的访问更快。并且在渲染èphase中执行的匿名函数的访问基本上等同于通过关系执行的访问。最佳性能基于直接命令避免ORM或activeRecord建模。但这意味着ORM授予的抽象级别的丢失。

请记住,如果您同时拥有(关系和匿名函数),则执行两次查询..