yii2 - 将 SQL 查询计算出的字段添加到 Yii2 ActiveRecord 模型中

标签 yii2 yii2-model

我正在编写代码来返回指定区域内且接近特定纬度和经度的位置列表。数据库布局是,有一个包含企业的位置表、一个定义区域的区域表(UrlName 是标识区域的 slug)以及一个将区域映射到位置的区域位置表。

SQL 查询非常复杂,但它计算了一个名为“Distance”的虚拟列,我希望在返回的模型中可以访问该虚拟列。

以下是我的位置模型中显示的代码的缩短版本:

        public static function getByRegionAndLatLong( $regionName, $lat, $long ) {

        $sql = "SELECT
            `Location`.`LocationId`,
            `Location`.`Latitude`,
            `Location`.`Longitude`,
                    (
                    3959 * acos (
                    cos ( radians( :Latitude ) )
                    * cos( radians( latitude ) )
                    * cos( radians( longitude ) - radians( :Longitude ) )
                    + sin ( radians( :Latitude ) )
                    * sin( radians( latitude ) )
                    )
                  ) AS Distance
                FROM Location
                    LEFT JOIN RegionLocation RL
                    ON RL.LocationId = Location.LocationId
                    LEFT JOIN Region R
                    ON R.RegionId = RL.RegionId
                WHERE R.UrlName= :UrlName
                ORDER BY Distance ;
        ";

        return Location::findBySql( $sql, [
            ':Latitude' => $lat,
            ':Longitude' => $long,
            ':UrlName' => $UrlName
        ] )->all();
    }

问题是,当我运行查询时,我希望计算出的“距离”列包含在结果中。但是,由于数据库中没有名为“Distance”的实际字段,Yii2 的 ActiveRecord 类不会将该字段添加到生成的模型中。

我可以通过在位置表中创建一个名为“距离”的列来解决这个问题,但我希望有一种方法可以在不更改数据库的情况下完成此操作。

我的最终目的是让模型返回一个位置对象数组,每个位置对象都有一个“距离”属性。然后, Controller 将使用类似于以下的代码生成 json feed:

    public function actionGetStudiosByLatLong( $regionName = '', $latitude='', $longitude='') {
        \Yii::$app->response->format = 'json';

        return Location::getByRegionAndLatLong( $regionName, $latitude, $longitude );
    }

最佳答案

您应该简单地将此属性添加到您的类中:

class Location extends \yii\db\ActiveRecord
{

    public function attributes()
    {
        // add distance attribute (will work for json output)
        return array_merge(parent::attributes(), ['Distance']);
    }

    // ...
}

了解更多关于Selecting extra fields的信息.

关于yii2 - 将 SQL 查询计算出的字段添加到 Yii2 ActiveRecord 模型中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39757358/

相关文章:

php - 可以在本地主机上使用 swiftMailer 发送电子邮件吗?

yii - 如何在yii2查询构建器中基于子查询在where条件中编写if条件

Yii2 保存后。使用changedAttributes显示错误

Yii2:我可以使用场景为不同的 Action 指定不同的模型字段集吗?

php - 使用 Yii2 中的关系连接多个表

php - GridView 中的 Yii2 列未显示(未设置)

php - 文本字段强制 基于单选按钮选择 - Yii2

validation - Yii2 比较验证器警报不会消失

transactions - Yii2 中带有回调的数据库事务

angularjs - 使用 oAuth2 协议(protocol)(HttpBearerAuth)使用 Angular 和 yii2 进行基于 token 的身份验证和授权